Javascript学习笔记(二)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。

posted on 2007-08-01 05:39  蹲在路边写代码  阅读(618)  评论(0编辑  收藏  举报

导航