⑦ 指定匹配的位置
正如前面所介绍的,正则表达式中的多个元素才能够匹配字符串中的一个字符。例如,\s匹配的只是一个空白符。还有一些正则表达式的元素匹配的是字符之间的位置,而不是实际字符。例如\b匹配的是一个单字的边界,即位于\w(ASCII单字字符)字符和\W(非单字字符)之间的边界,或位于一个ASCII单字字符与一个字符串的开头或结尾之间的边界。像\b这样的元素不指定匹配的字符串中使用的字符,它们指定的是匹配所发生的合法位置。有时我们称这些元素为正则表达式的锚,因为它们将模式定位在检索字符串中的一个特定位置上。最常用的锚元素是^,它使模式定位在字符串的开头,而锚元素$则使模式定位在字符串的末尾。
例如,要匹配单字“JavaScript”,可以使用正则表达式/^JavaScript$/。如果想检索“Java”这个单字自身(不像在“JavaScript”中那样作为前缀),可以使用模式/\sJava\s/,它要求在单字Java之前和之后都要有空格。但是这样做有两个问题:
⑴ 如果“Java”出现在一个字符串的开头或结尾,该模式就不会与之匹配,除非在开头处或者结尾处有一个空格。
⑵ 当这个模式找到了一个与之匹配的字符串时,它返回的匹配字符串的前端和后端都有空格,这并不是我们想要的。
因此我们使用单字的边界\b来代替真正的空格符\s进行匹配。结果表达式是/\bJava\b/。
元素\B将把匹配锚定在不是单字边界的位置。因此,模式/\B[Ss]cript/与“JavaScript”和“postscript”匹配,但是不与“script”和“Scripting”匹配。
在JavaScript 1.5中,还可以使用任意的正则表达式作为锚定条件。如果在符号“(?=”和“)”之间加入一个表达式,它就是一个前向声明,指定接下来的字符必须被匹配,但并不真正进行匹配。例如要匹配一种常用的程序设计语言的名字,但只在其后有冒号时匹配,可以使用/[Jj]ava([Ss]cript)?(?=\:)/。这个模式与“JavaScript:The Definitive Guide”中的单字“JavaScript”匹配,但是与“Java in a Nutshell”中的“Java”不匹配,因为其后没有冒号。
如果用“(?!”引入声明,它将是反前向声明,指定接下来的字符都不必匹配。例如/Java(?!Script) ([A-Z]\w*)/匹配的是“Java”后跟随一个大写字母和任意多个ASCII单字字符,但是不能跟随“Script”。它与“JavaBeans”匹配,不与“Javanese”匹配,与“JavaScrip”匹配,但不与“JavaScript”或“JavaScripter”匹配。
下表总结了正则表达式的锚:
字符 | 含义 |
^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 |
$ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
\b | 匹配一个词语的边界。简而言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置 |
\B | 匹配非词语边界的位置 |
(?=p) | 正前向声明,要求接下来的字符都与模式p匹配,但是不包括匹配中的那些字符。 |
(?!p) | 反前向声明,要求接下来的字符不与模式p匹配 |