JavaScript:正则表达式(7)

来源:互联网 发布:360提示网络连接失败 编辑:程序博客网 时间:2024/06/04 18:50

⑦ 指定匹配的位置

正如前面所介绍的,正则表达式中的多个元素才能够匹配字符串中的一个字符。例如,\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匹配