正则表达式的定义

正则表达式是一个描述字符模式的对象。JavaScript的RegExp类表示正则表达式,String和RegExp都定义的方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能。
JavaScript中的正则表达式用RegExp对象表示,可以使用RegExp构造函数来创建RegExp对象,不过RegExp对象更多的是通过一种特殊的直接量语法来创建。

正则表达式直接量定义为包含在一对斜杠之间的字符:

var pattern = /s$/;

可以用RegExp()构造函数创建:

var pattern = new RegExp(“s$”);

直接量字符

\o

null字符(\u0000)

\t

制表符(\u0009)

\n

换行符(\u000A)

\v

垂直制表符(\u000B)

\f

换页符(\u000C)

\f

回车符(\u000D)

\xnn

由十六进制数nn制定的拉丁字符,例如,\x0A等价于\n

\uxxxx

由十六进制数xxxx指定的Unicode字符,例如\u0009等价于\t

\cX

控制字符^X,例如,\cJ等价于换行符\n

 字符类

将直接量字符单独放进方括号内疚组成了字符类。一个字符类可以匹配它所有包含的任意字符。正则表达式/[abc]/就是和字母“a”、“b”、“c”中的任意一个都匹配。另外,可以通过“^”符号来定义否定字符类,它匹配所有不包含在方括号内的字符。正则表达式/[^abc]/匹配的是“a”、“b”、“c”之外的所有字符。字符类可以使用连字符来表示字符范围。要匹配拉丁字母表中的小写字母,可以使用/[a-z]/,要匹配拉丁字母表中任何字母和数字,则使用/[a-zA-Z0-9]/。

正则表达式的字符类

[…]

方括号内的任意字符

[^…]

不在方括号内的任意字符

.

除换行符和其他Unicode行终止符之外的任意字符

\w

任何ASCII自负组成的单词,等价于[a-zA-Z0-9]

\W

任何不适ASCII字符组成的单词,等价于[^a-zA-Z0-9]

\s

任何Unicode空白符

\S

任何非Unicode空白符的字符,注意\w和\S不同

\d

任何ASCII数字,等价于[0-9]

\D

除了ASCII数字之外的任何字符,等价于[^0-9]

[\b]

退格直接量(特列)

重复

正则表达式的重复字符语法

{n,m}

匹配前一项至少n次,但不能超过m次

{n,}

匹配前一项n次或者更多次

{n}

匹配前一项n次

?

匹配前一项0次或者1次,也就是说前一项可选

+

匹配前一项1次或多次,等价于{1,}

*

匹配前一项0次或者多次,等价于{0,}

 非贪婪的重复

只需在待匹配的字符后面跟随一个问号即可。

 选择、分组和引用

正则表达式的语法还包裹制定选择项、子表达式分组和引用前一个表达式的特殊字符。自负“|”用于分割供选择的字符。

正则表达式的圆括号有多种作用。一个作用是把单独的项组合为子表达式,以便可以向处理一个独立的但愿那样用“|”、“*”、“+”或者“?”等对但愿内的项进行处理。

正则表达式中,圆括号的灵一个作用是在完整的模式中定义子模式。当一个正则表达式成功的和目标字符串相匹配时,可以从目标串种抽出园括号中的子模式相匹配的部分。

正则表达式的选择、分组和引用字符

|

选择,匹配的是该符号左边的子表达式或右边的子表达式

(…)

组合,将几个项组合为一个单元,这个单元可以通过“*”,“+”,“?”和“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用。

(?:…)

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

\n

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

 指定匹配位置

正则表达式中的锚字符

^

匹配字符串的开头,在多行检索中,匹配一行的开头

$

匹配字符串的结尾,在多行检索中,匹配一行的结尾

\b

匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置(但需要注意,[\b]匹配的是退格符)

\B

匹配非单词边界的位置

(?=p)

零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符

(?!p)

零宽负向先行断言,要求接下来的字符不与p匹配

 修饰符

JavaScript支持三个修饰符,修饰符“i”用以说明模式匹配是不区分大侠写的。修饰符“g”说明模式匹配应该是全局的,也就是说,应该找出被检索字符串中所有的匹配。修饰符“m”用以在多行模式中执行匹配,这种模式下,如果待检索的字符串包含多行,那么^和$锚字符除了匹配整个字符串的开始和结尾之外,还能匹配每行的开始和结尾。

i

执行不区分大写匹配

g

执行一个全局匹配,简而言之,即找到所有的匹配,而不是在找到第一个之后就停止

m

多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束

 用于模式匹配的String方法

String支持4中使用正则表达的方法,最简单的是search(),它的参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到匹配的子串,返回-1.

search()不支持全局检索,因为它忽略正则表达式参数中的修饰符g。

replace()方法用以执行检索与替换操作,第一个参数是一个正则表达式,第二个表达式是要进行替换的字符串。如果正则表达式中设置了修饰符g,那么源字符中所有模式匹配的子串都将替换成第二个参数指定的字符串;如果不带修饰符,则只替换所匹配的第一个子串。

match()方法是最常用的String正则表达式方法。它的唯一参数就是一个正则表达式,返回的是一个由匹配结果组成的数组。

 RegExp对象

RegExp构造函数带有两个字符串参数,第二个参数可选,如果提供第二个参数,它就制定正则表达式的修饰符。

 RegExp的属性

每个RegExp对象都包含5个属性。属性source是一个只读的字符串,包含正则表达式的文本。属性global是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符g。属性ignoreCase也是一个制度的布尔值,用以说明正则表达式是否带有修饰符i。属性multiline是一个只读的布尔值,用以说明正则表达式是否带有修饰符m。最后一个属性lastIndex,它是一个可读/写的整数。如果匹配模式带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec()和test()方法用到。

 RegExp的方法

RegExp最主要的执行模式匹配的方法是exec()。exec()方法对一个指定的字符串执行一个正则表达式,简言之,就是在一个字符串中执行匹配检索。如果它没有找到任何匹配,它就返回null,如果找到了一个匹配,将返回一个数组,就像match()方法为非全局检索返回的数组一样。

另外一个RegExp方法是test(),比exec()更简单一些。用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true。


发表评论