JavaScript 正则表达式

  正则表达式定义:
  直接量,var pattern = /s$/;  //与所有以字母"s"结尾的字符串匹配
  构造函数,var pattern = new RegExp('s$');

  直接量字符:
    字符 | 匹配
    字母数字字符 | 自身
    /o | NUL字符(/u0000)
    /t | 制表符(/u0009)
    /n | 换行符(/u000A)
    /v | 垂直制表符(/u000B)
    /f | 换页符(/u000C)
    /r | 回车(/u000D)
    /xnn | 由十六进制数nn指定的拉丁字符,如: /x0A等价于/n
    /uxxxx | 由十六进制数xxxx指定的Unicode字符,如: /u0009等价于/t
    /cx | 控制字符^X。如/cJ等价于换行符/n 

  字符类:
    字符 | 匹配
    [...] | 位于括号内的任意字符
    [^...] | 不在括号内的任意字符
    . | 除换行符和其他Unicode行终止符之外的任意字符
    /w | 任何ASCII单字字符,等价于[a-zA-Z0-9]
    /W | 任何ASCII非单字字符,等价于[^a-zA-Z0-9]
    /s | 任何Unicode空白符
    /S | 任何非Unicode空白符
    /d | 任何ASCII数字,等价于[0-9]
    /D | 任何ASCII数字外的任何字符,等价于[^0-9]
    [/b] | 退格直接量(特例)
  在方括号内也可以使用这些特殊字符类转义序列。如/[/s/d]/匹配任意的空白符或数字。

  重复:
    字符 | 含义
    {n,m} | 匹配前一项至少n次,但不超过m次
    {n,} | 匹配前一项n次,或更多次
    {n} | 匹配前一项恰好n次
    ?  | 匹配前一项0次或1次,等价于{0,1}
    +   | 匹配前一项1次或多次,等价于{1,}
    *   | 匹配前一项0次或多次,等价于{0,}
  注意*和?,由于这些字符可能匹配前面字符的0个实例,所以它们允许什么都不匹配,如/a*/可以与"bbbb"匹配,因为它含有0个a。
  重复字符可以匹配尽可能多的字符,而且允许接下来的正则表达式继续匹配,可以说重复是“贪婪的”。但我们也可以以非贪婪的方式进行重复,只需要在重复字符后加问好即可。

  选择、分组和引用:
    字符 | 含义
    |   | 选择。匹配的是该富豪左边的子表达式或右边的子表达式
    (...)   | 组合。将几个项目组合为一个单元,这个单元可以由*、+和?等符号使用,还可以记住和这个组合匹配的字符以供此后的引用使用
    (?:...)   | 只组合。把项目组合到一个单元,但不记忆与该组合匹配的字符。
    /n   | 和第n个分组第一次匹配的字符相匹配。组是括号中的子表达式(可能是嵌套的)。组号是从左到右计数的左括号数,以(?:形式分组的组不编码

  正则表达式的语法还包括指定选择项、对子表达式分组和引用前一子表达式的特殊字符。
  字符"|"用于分隔供选择的字符。如:/ab|cd|ef/匹配字符串"ab",或"cd",或"ef"。选择项是从左到右考虑,直到发现匹配项。如果左边的选择项匹配,就忽略右边的匹配项。在应用中要注意把更好的匹配放在正则式的左边。

  括号在正则表达式中的作用有几种。
  一种是把单独的项目组合成子表达式,以便可以像处理一个独立的单元那样用|、*、+或?等来处理它们。如/java(script)?/匹配"java"其后可以有也可以没有"script";
  另一种是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串匹配时,可以从目标串中抽出和括号中的子模式相匹配的部分(之后详述);
  第三种是允许我们在同一正则表达式后部引用前面的子表达式,这是通过在字符"/"后加一位或多位数字实现的。数字指定了带括号的子表达式在正则式中的位置。如/n引用的是第n个带括号的表达式。需要注意的是,由于子表达式可以被嵌套在别的子表达式中,所以它的位置是被计数的左括号的位置。对正则表达式中前一子表达式的引用所指的并不是那个子表达式的模式,而是与那个模式相匹配的文本。如我们在用正则表达式匹配单引号或双引号时,可以用/n的方法来进行约束。
  在JavaScript1.5中,无须创建带编码的引用就可以将正则表达式中的项目进行组合。它是以(?和)来分组。

  指定匹配的位置:
     字符   | 含义
     ^   | 匹配字符串的开头,在多行检索中,匹配一行的开头
     $   | 匹配字符串的结尾,在多行检索中,匹配一行的结尾
     /b   | 匹配一个词语的边界。也就是位于字符/w和/W之间的位置,或位于    字符/w和字符串开头或结尾之间的位置(注意区分[/b])
     /B   | 匹配非词语边界的字符
     (?=)   | 正前向声明,要求接下来的字符都与模式p匹配,但是不包括匹配中    的那些字符
     (?!p)   | 反前向声明,要求接下来的字符不与模式p匹配

  标志:
  正则表达式的标志,说明高级模式匹配规则。它是在"/"符号之外说明的,位于第二个斜杠之后。
  JavaScript1.2支持两个标志,标志i说明模式匹配应该是大小写不敏感的字符,标志g说明模式匹配应该是全局的,即要找出被检索字符串中所以的匹配。
  JavaScript1.5还支持标志m,它以多行模式执行模式匹配。在这种模式中,如果要检索的字符串中含有换行符,^和$锚除了匹配字符串的开头和结尾外,还匹配每行的开头和结尾。

  用于模式匹配的String方法
  search()方法:该方法以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的子串,返回-1。如果参数不是正则表达式,它首先将被传递给RegExp构造函数,转换成正则表达式。search()方法不支持全局检索,因为它忽略了正则表达式参数的标志g。

  replace()方法:执行检索和替换操作。它的第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。如果正则表达式中设置了标志g,该方法将用替换字符串替换被检索的字符串中所有与模式匹配的子串。否则只替换发现的第一个与模式匹配的子串。如果第一个参数是字符串,而不是正则表达式,它将直接检索那个字符串,而不用RegExp()构造函数将它转换成正则表达式。
  replace()方法的更强用法是,由于正则表达式中用括号括起来的子表达式是从左到右进行编号的,而且正则表达式会记住与每个子表达式匹配的文本。如果在替换字符串中出现了符号$加数字,那么replace()将用与指定的子表达式相匹配的文本来替换这两个字符。
  而且,replace()方法的第二个参数还可以是函数,该函数能够动态计算替换字符串。

  match()方法:它的参数是一个正则表达式(或把它的参数传递个RexExp()函数以转换成正则表达式),返回包含了匹配结果的数组。如果该正则表达式有标志g,该方法返回的数组包含的就是出现在字符串中的所有匹配。否则,只检索第一个匹配。但是,即使match()执行的不是全局检索,它也返回一个数组。在这种情况下,数组的第一个元素就是匹配的字符串,而余下的元素则是表达式中用括号括起来的子表达式。因此,如果match()返回了一个数组a,那么a[0]存放的是完整的匹配,a[1]存放的是与第一个括号括起来的表达式匹配的子串,依次类推。为了和replace()方法保持一致,a[n]存放的是$n的内容。
  此外,match()方法返回的数组具有length、index和input属性。其中index包含的是字符串中匹配开始处的字符的位置,后者则是目标字符串的一个副本。

  split()方法:这个方法可以把调用它的字符串分解为一个子串数组,使用的分隔符是它的参数。如果split()方法使用正则表达式作为参数,就可以有一个非常强大的分解方式。


  RegExp对象
  构造函数RegExp()有两个字符串参数,其中第二个参数是可选的,它们是"g"、"i"、"m"的组合。第一个参数是包含正则表达式主体的字符串,也就是正则表达式直接量中出现斜线之间的文本。

  RegExp对象定义了两个用于执行模式匹配操作的方法。
  exec()方法与String的match()方法相似,它是以字符串为参数的RegExp方法。exec()方法对一个指定的字符串执行一个正则表达式,也就是在一个字符串中检索匹配。如果没有匹配返回null,如果找到匹配返回一个数组。结果与match()方法的非全局检索返回的数组一样,而不管正则表达式中是否具有全局属性g。
  
 

--------------------------------------------------------------------------
关于正则表达式语法的完整细节的资料:Larry Wall、Tom Christiansen和Jon Orwant(O'Reilly)编写的《Programming Perl》;由Jeffrey E.F.Friedl(O'Reilly)编写的《Mastering Regular Expressions》。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值