RegExp直接量和对象的创建
就像字符串和数字一样,程序中每个取值相同的原始类型直接量均表示相同的值,这是显而易见的。程序运行时每次遇到对象直接量(初始化表达式)诸如{}和[]的时候都会创建新对象。比如,如果在循环体中写var a = [],则每次遍历都会创建一个新的空数组。正则表达式直接量则与此不同,ECMAScript 3规范规定,一个正则表达式直接量会在执行到它时转换为一个RegExp对象,同一段代码所表示正则表达式直接量的每次运算都返回同一个对象。ECMAScript 5规范则做了相反的规定,同一段代码所表示的正则表达式直接量的每次运算都返回新对象。I E一直都是按照EC-MAScript 5规范实现的,多数最新版本的浏览器也开始遵循EC-MAScript 5,尽管目前该标准并未全面广泛推行。
1.1直接量字符
正则表达式中的所有字母和数字都是按照字面含义进行匹配的。JavaScript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜线(\)作为前缀进行转义。比如,转义字符\n用以匹配换行符。表10-1中列出了这些转义字符。
表10-1:正则表达式中的直接量字符
字符
匹配
字母和数字字符
自身
\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
在正则表达式中,许多标点符号具有特殊含义,它们是:^ $ . * + ? = ! : | \ / ( ) [ ] { }
正则表达式“/\/”用以匹配任何包含反斜线的字符串。
1.2字符类
例如,/[\u0400-\u04FF]/用以匹配所有的Cyrillic字符)。
表10-2:正则表达式的字符类
字符
匹配
[...]
方括号内的任意字符
[^...]
不在方括号内的任意字符
.
除换行符和其他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
退格直接量(特例)
注意,在方括号之内也可以写这些特殊转义字符。比如,由于\s匹配所有的空白字符,\d匹配的是所有数字,因此/[\s\d]/就匹配任意空白符或者数字。注意,这里有一个特例。下面我们将会看到转义符\b具有的特殊含义,当用在字符类中时,它表示的是退格符,所以要在正则表达式中按照直接量表示一个退格符,只需要使用具有一个元素的字符类/[\b]/。
1.3重复
我们在正则模式之后跟随用以指定字符重复的标记。由于某些重复种类非常常用,因此就有一些专门用于表示这种情况的特殊字符。例如,“+”用以匹配前一个模式的一个或多个副本。表10-3总结了这些表示重复的正则语法。
表10-3:正则表达式的重复字符语法
字符
含义
{n,m}
匹配前一项至少n次,但不能超过m次
{n,}
匹配前一项至少n次
{n}
匹配前一顶n次
?
匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
+
匹配前一项1次或多次,等价于{1,}
*
匹配前一项0次或多次,等价于{0,}
这里有一些例子:
/\d{2,4}/ // 匹配2~4个数字
/\w{3}\d?/ // 精确匹配三个单词和一个可选的数字
/\s+java\s+/ // 匹配前后带有一个或多个空格的字符串"java"
/[^(]/ // 匹配一个或多个非左括号的字符