Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

正则表达式语法规则 #7

Open
hoperyy opened this issue Jun 24, 2017 · 0 comments
Open

正则表达式语法规则 #7

hoperyy opened this issue Jun 24, 2017 · 0 comments

Comments

@hoperyy
Copy link
Owner

hoperyy commented Jun 24, 2017

匹配一个字符的

  • 普通字符

    • 含义:字母、数字、汉字、下划线、没有特殊定义的标点符号
    • 举例:表达式 c 匹配字符 "c"
  • 简单的转义字符

    • 不便书写的字符,需要加上 \
      • \r\n:回车 和 换行符
      • \t:制表符
    • 字符本身有其他含义,需要加上 \
      • \^:匹配 ^ 符号本身
      • \$:匹配 $ 符号本身
      • \.:匹配 . 符号本身
  • 多个选择符中的一个(注意:是多个可选字符中的一个,而不是多个

    • 系统定义的
      • \d:任意一个数字,0~9 中的任意一个字符
      • \w:任意一个字母、数字、下划线,即 A~Z、a~z、0~9、_ 中的任意一个字符
      • \s空格制表符换页符空白字符 的其中一个
      • .:小数点可以匹配除了换行符(\n)以外的任意一个字符
      • /S:匹配所有非空白字符(/s 可匹配各个空白字符)
      • /D::匹配所有的非数字字符
      • /W:匹配所有的字母、数字、下划线以外的字符
      • /B:匹配非单词边界,即左右两边都是 /w 范围或者左右两边都不是 /w 范围时的字符缝隙
    • 自定义
      • []: 匹配 [] 中的任意一个字符
      • [^]:匹配括号内字符外的任意一个字符

匹配多个字符的(次数修饰)

以上内容是匹配一个字符的情况,当需要匹配多个字符时,我们有两种方式:

  • 多写几次,如 /cc/ 匹配字符串 "cc"
  • 使用“次数修饰”,即可写成 /c{2}/ 匹配字符串 "cc"

次数修饰:

  • 位置:

    • “次数修饰” 放在 “被修饰的表达式” 后面,比如 /[bcd][bcd]/ 可以写成 [bcd]{2}
  • 写法

    • {n}:表达式重复 n 次。
      • 比如:\w{2} 相当于\w\w
    • {m,n}:表达式至少重复 m,最多重复 n
      • 比如:ba{1,3} 可以匹配 babaabaaa
    • {m,}:表达式至少重复 m
      • 比如:\w\d{2,} 可以匹配 a12_456M12345
    • ?:匹配表达式 0 次或 1 次,相当于 {0,1}
      • 比如:a[cd]?可以匹配 aacad
    • +:表达式至少出现 1 次,相当于 {1,}
      • 比如:a+b 可以匹配 abaabaaab……
    • *:表达式不出现或出现任意次,相当于 {0,}

匹配次数中的贪婪与非贪婪

  • 贪婪

    • 解释:

      • 使用修饰匹配次数的特殊符号时,有几种表示方法可以使用同一个表达式能够匹配不同的次数,如 {m,n}{m,}*+,具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。
    • 举例: 针对 "dxxxdxxxd"

      • 表达式 (d)(\w+)
        • \w+ 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"
      • 表达式 (d)(\w+)(d)
        • \w+ 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 \w+ 也能够匹配上最后一个 "d",但是为了整个表达式能够匹配成功, \w+ 可以“让出”它本来能够匹配的最后一个 "d"
    • 结论:

      • 由此可见,/w+ 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 *{m,n} 的表达式都是尽可能地多匹配,带 ? 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。
  • 非贪婪(勉强)

    • 解释:

      • 在修饰匹配次数的特殊符号后再加上一个 ? 号,可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的“不匹配”。这种模式叫“非贪婪”模式,又叫“勉强”模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。
    • 举例:针对文本 "dxxxdxxxd"

      • 表达式 (d)(\w+?)
        • \w+? 将尽可能少地匹配第一个 "d" 之后的字符,结果就是 \w+? 只匹配了一个 "x"
      • 表达式 (d)(\w+?)(d)
        • 为了整个表达式匹配成功,\w+? 不得不匹配 xxx 才可以让后面的 "d" 匹配,从而使整个表达式匹配成功。因此结果是 \w+? 匹配 "xxx"

不匹配字符的

  • ^:不匹配任何字符,与字符串开始的地方匹配
  • $:不匹配任何字符,与字符串结束的地方匹配
  • \b:匹配一个单词边界,这个边界一边是 \w,一边是 非\w

其他通用规则

  • 表达式中,可以使用 \xNN\uNNNN 表示一个字符(N表示一个十六进制数)

  • 在表达式 \s\d\w\b 表示特殊意义的同时,对应的大写字母表示相反的意义

特殊表达式

  • |,匹配左边或右边
    • tip:如果左右都匹配上了,则只记住左边
  • ():有两个作用
    • tip:在修饰匹配次数的时候,括号内的表达式作为整体被修饰
    • tip:取匹配结果的时候,括号内的表达式匹配到的结果可以被单独得到
  • (?:xxx):但是如果希望匹配结果不记录供以后使用,可以使用 (?:xxx) 的格式
    • 举例:表达式 "(?:(/w)/1)+" 匹配 "a bbccdd efg" 时,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(/w)" 使用 "/1" 来引用。
  • x(?=y):匹配 x,仅当后面紧跟 y 时。如果符合匹配,则只有 x 被记住,y 不会被记住
  • x(?!y):匹配 x,仅当后面不紧跟 y 时。如果符合匹配,则只有 x 被记住,y 不会被记住
  • 反向引用 \1\2……

参数

  • g

    • 含义:全局匹配
  • i

    • 含义:不区分大小写
  • m

    • 含义:多行匹配
    • tip:如果是多行字符,加上此参数后,每行字符串会增加 ^$

方法

  • 表达式对象的方法

    • exec(str)
      + 返回值:与表达式匹配的一个字符串,并以数组的形式呈现;如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有 () 中匹配的符号
      + 加参数 g 的话,如果有多个匹配,则第一次执行 exec 返回第一个匹配,继续执行 exec,则依次返回第二个、第三个匹配
      + 不加参数 g 的话,无论执行多少次 exec,都只返回第一个匹配

    • test(str)
      + 作用:判断字符串 str 是否匹配表达式,返回一个布尔值
      + 无论是否加参数 g,返回结果是一样的

  • String 的方法

    • match(expr)

      • 返回值:返回与 expr 相匹配的一个字符串数组
      • 如果没有参数 g,则总是返回第一个匹配,加入参数 g 则一次性返回所有的匹配
    • search(expr)

      • 返回值:返回字符串中与 expr 相匹配的第一个匹配的 index
      • 是否加参数 g:效果是一样的
    • replace(expr, str)

      • 作用:将字符串中匹配 expr 的部分替换为 str。。另外在replace 方法中,str 中可以含有一种变量符号 $ ,格式为$n,代表匹配中被记住的第 n 的匹配字符串(注意小括号可以记忆匹配)。

      • g:全局替换

      • 不加 g:只替换第一个匹配

    • split(expr)

      • 作用:将字符串以匹配 expr 的部分做分割
      • 返回值:返回一个数组
      • 是否加参数 g:结果是一样的

属性

  • 表达式自身的属性

    • lastIndex

      • 返回值:当前匹配字符串的下一个字符的位置
    • 举例:
      +
      var regx=/u\d/g;
      var rs=regx.exec('u1du2e');
      var lastIndex1=regx.lastIndex;
      rs=regx.exec('u1du2e');
      var lastIndex2=regx.lastIndex;
      rs=regx.exec('u1du2e');
      var lastIndex3=regx.lastIndex;
      console.log(lastIndex1, lastIndex2, lastIndex3);// 2,5,0

    • source
      + 返回值:返回表达式字符串自身
      + 举例:

         var regx=/user\d/;
         var rs=regx.exec('sdsfuser1dfsfuser2');
         var source=regx.source; 
      
         source的值为user\d
      
  • 表达式匹配结果的属性

    • index:返回当前匹配的位置

      • 加入 g 有影响
    • input 用于匹配的字符串

    • [0]

      • 返回值:返回匹配结果中的第一个匹配值,对于 match 而言可能返回一个多值的数字,除了 [0] 之外,还有 [1]、[2]、[3]……

      • 注意:

        var regx=/user/d/;
        var rs=regx.exec(“sdsfuser1dfsfuser2”);
        var value1=rs[0];
        rs=regx.exec(“sdsfuser1dfsfuser2”);
        var value2=rs[0]; 
        value1的值为user1,value2的值为user2
        

tips

  • HTMLtextarea 输入域中,按一个 Enter 键,对应的控制字符为 /r/n,即“回车换行”,而不是 /n/r
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant