JavaScript正则表达式的模式匹配

正则表达式(regular expression)是一个描述字符模式的对象。JavaScript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能。

正则表达式的定义:

      JavaScript中的正则表达式用RegExp对象表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp()对象更多的是通过一种特殊的直接量语法来创建。正则表达式直接量定义为包含着一对斜杠(/)之间的字符,例如:

        var pattern=/s$/;         等价于          var pattern=new RegExp("s$");

运行这段代码,创建一个新的RegExp对象,并将它赋值给变量Pattern。这个特殊的RegExp对象用来匹配所有以字母"s"结尾的字符串。(同一段代码所表示的正则表达式直接量的每次运算都返回新对象)

直接量字符:

       正则表达式中的所有字母和数字都是按照字面含义进行匹配的。JavaScript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜杠(\)作为前缀进行转义。

正则表达式中的直接量字符
字母和数字字符 自身
\r 回车符
\o NUL字符(\u0000)
\t 制表符
\n 换行符
\v 垂直制表符
\f 换页符
\cX 控制字符^X
\xnn 由十六进制数nn指定的拉丁字符
\uxxxx

由十六进制数xxxx指定的Unicode字符

字符类:

      将直接量字符单独放进方括号内就组成了字符类(character  class)。一个字符类可以匹配它所包含的任意字符。字符类可以使用连字符来表示字符范围。

正则表达式的字符类
字符 匹配
[] 方括号内的任意字符
[^] 不在方括号内的任意字符
. 除换行符和其他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] 退格直接量

重复:

正则表达式的重复字符语法
字符 含义
{n,m} 匹配前一项至少n项,但不能超过m次
{n,} 匹配前一项n次或更多次
{n} 匹配前一项n次
匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
+ 匹配前一项1次或者多次,等价于{1,}
* 匹配前一项0次或者多次,等价于{0,}

选择、分组和引用:

   字符”|“用于分隔供选择的字符,选择项的尝试匹配次序是从左到右,直到发现匹配项。 

   正则表达式中的圆括号有多种作用:

  •                一个作用是把单独的项组合成字表达式。
  •                另一个作用是在完整的模式中定义子模式。
  •               另一个用途是允许在同一正则表达式的后部引用前面的子表达式。

正则表达式的选择、分组和引用字符
字符 含义
| 选择,匹配的是该符号左边的子表达式或右边的子表达式
组合,将几个项组合为一个单元,这个单元可以通过”*“、”+“、”?“、”|“等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用

(?

只组合,把项组合到一二单元,但不记忆与该组相匹配的字符

\n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,”(?:“形式的分组不编码

指定匹配的位置:

       有时我们称这些元素为正则表达式的锚,因为它们将模式定位在搜索字符串的特定位置上。

正则表达式中的锚字符
字符 含义
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,简而言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串开头或者结尾之间的位置([\b]匹配的是退格符)
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配

修饰符:

      正则表达式的修饰符,用以说明高级匹配模式的规则。修饰符是放在“/”符号之外的,也就是说,它们不是出现在两条斜杠之间,而是第二条斜线之后。

正则表达式修饰符
字符 含义
i 执行不区分大小写的匹配
g 执行一个全局匹配,简而言之,即找到所有的匹配,而不是在找到第一个之后就停止
m 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束

用于模式匹配的String方法:

     String支持4种使用正则表达式的方法。

  •      最简单的是search(),它的参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到匹配的子串,它将返回-1。(search()不支持全局检索)如   "javascript".search(/script/i);       //=>4
  •        replace()方法用以执行检索与替换操作,其中第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。
  •        match()方法是最常用的String方法,它的唯一参数就是一个正则表达式(或者通过RegExp()构造函数将其转换为正则表达式),返回的是一个由匹配结果组成的数组。
  •        split()方法用以将调用它的字符串拆分为一个子串组成的数组,使用的分隔符是split()的参数。split()方法的参数也可以是一个正则表达式。如“123,456,789”.split(",") //=>["123","456","789"]

RegExp对象:

RegExp()构造函数带有两个字符串参数,其中第二个参数是可选的,RegExp()用以创建新的RegExp对象。RegExp()的第二个参数是可选的,如果提供第二个参数,它就制定正则表达式的修饰符,不过只能传入修饰符i,g,m或者它们的组合。

每个RegExp对象都包含5个属性。

  1.      属性source是一个只读的字符串,包含正则表达式的文本。
  2.      属性global是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符g。
  3.      属性ignoreCase是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符i。
  4.      属性multiline是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符m。
  5.      属性lastIndex是一个可读/写的整数,如果匹配模式带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置。

RegExp对象定义了两个用于执行模式匹配操作的方法:

  • 最主要的执行模式匹配的方法是exec(),对一个指定的字符串执行一个正则表达式,简而言之,就是在一个字符串中执行匹配检索。如果没有找到任何批评,就返回null,如果找到了一个匹配,就返回一个数组。
  • 另一个RegExp方法是test(),它的参数是一个字符串,用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,就返回true。例如:

          var   pattern=/java/i;

         pattern.test("javascript");    //=>true







猜你喜欢

转载自blog.csdn.net/zmeilin/article/details/80180490