前言
之前看《JavaScript高级程序设计》这本书的时候,由于看得太匆忙,都没能好好理解正则表达式这一内容,总觉得其中对正则表达式的介绍不是很详细,而自己也没有查阅其它资料,只是泛泛地看了一遍,大致就留下了一个正则表达式的印象。后来在笔试中也见过很多关于正则表达式的题,基本是一顿乱写。今天又翻看了红皮书关于正则表达式的这一节内容,再结合着看了《JavaScript语言精粹》中对于正则表达式的介绍,加之网上搜到的一些资料,想把关于正则表达式这一内容总结如下。
正文
什么是正则表达式?正则表达式(英文:Regular Expression)是一门简单的语言的语法规范。在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规
则的字符串的单个字符串。
ECMAScript 通过RegExp类型来支持正则表达式。在JavaScript程序中,正则表达式必须写在一行中。使用下面的语法,可以创建一个正则表达式:
var expression=/ pattern /flags;
其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带一个或者多个标志(flags),用以标明正则表达式的行为。
正则表达式的匹配模式支持一下3个标志:(也称为正则表达式修饰符)
g :表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
i :表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;
m :表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在于模式匹配的项。
因此,一个正则表达式就是一个模式与上述三个标志的组合体。
正则表达式中的特殊字符
- 正则表达式中的直接量字符
\f | 匹配换页符,等价于\x0c和\cL |
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
\v | 匹配一个垂直制表符 |
\/ | 一个 / 直接量 |
\\ | 一个 \ 直接量 |
\( | 一个 ( 直接量 |
\) | 一个 )直接量 |
\. | 一个 . 直接量 |
\* | 一个 * 直接量 |
\+ | 一个 /+直接量 |
\? | 一个 /?直接量 |
\| | 一个 | 直接量 |
\[ | 一个 /[直接量 |
\] | 一个 /]直接量 |
\{ | 一个 {直接量 |
\} | 一个 }直接量 |
\XXX | 由十进制数 XXX 指 定的ASCII码字符 |
\Xnn | 由十六进制数 nn 指定的ASCII码字符 |
\cX | 控制字符^X. 例如, \cI等价于 \t, \cJ等价于 \n |
- 正则表达式的字符类
[...] | 字符集(characterset),匹配这个集合中的任一一个字符(或元字符) |
[^...] | 不匹配这个集合中的任何一个字符。[^0-9]表示非数字,[^a-z]表示非小写字母 |
. | ‘.’(小数点)会匹配字符串中除了换行符\n之外的所有字符,等价于[^\n] |
\w | 匹配一个可以组成单词的字符,包括字母、数字、下划线,等同于字符集合[a-zA-Z0-9_]。如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9] |
\W | 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9_]。无论是中文和“?”都算作是非单词字符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于[^\f\n\r\t\v]。 |
\d | 匹配一个数字字符,/\d/=/[0-9]/ |
\D | 匹配一个非数字字符,/\D/=/[^0-9]/ |
[\b] | 匹配一个退格符 |
- 正则表达式的复制字符
{n} | 精确匹配前一项n次 |
{n,} | 匹配前一项n次以上 |
{n,m} | 匹配前一项n到m次 |
? | 匹配前一项0次或1次,也就是说前一项是可选的.等价于 {0, 1} |
+ | 匹配前一项1次或多次,等价于{1,} |
* | 匹配前一项0次或多次.等价于{0,} |
- 正则表达式的分组和选择
(...) | “分组”将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引用使用\n和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数 |
| | “选择”匹配该符号左边或者右边的子表达式 |
- 正则表达式的匹配位置
^ | 匹配的是字符的开头,在多行检索中,匹配的是一行的开头 ‘^’在正则表达式开始部分的时候表示开头的意思,例如/^c/表示开头是c;但是在字符集和中,它表示的是类似“非”的意思 |
$ | 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾 |
\b | 匹配的是一个词语的边界,只有字符串的开头和结尾才算数。简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符) |
\B | 匹配的是非词语的边界的字符 |
- 正则表达式的特殊字符
\ | (1)做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 (2)对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 |
(pattern) | 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。 |
(?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。 |
(?=pattern) | 正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
\xn |
匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。 |
\num | 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。 |
\n | 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 |
\nm | 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。 |
\nml | 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。 |
\un | 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(?)。 |