⑦ 指定匹配的位置
正如前面所介紹的,Regex中的多個元素才能夠匹配字串中的一個字元。例如,\s匹配的只是一個空白符。還有一些Regex的元素匹配的是字元之間的位置,而不是實際字元。例如\b匹配的是一個單字的邊界,即位於\w(ASCII單字字元)字元和\W(非單字字元)之間的邊界,或位於一個ASCII單字字元與一個字串的開頭或結尾之間的邊界。像\b這樣的元素不指定匹配的字串中使用的字元,它們指定的是匹配所發生的合法位置。有時我們稱這些元素為Regex的錨,因為它們將模式定位在檢索字串中的一個特定位置上。最常用的錨元素是^,它使模式定位在字串的開頭,而錨元素$則使模式定位在字串的末尾。
例如,要匹配單字“JavaScript”,可以使用Regex/^JavaScript$/。如果想檢索“Java”這個單字自身(不像在“JavaScript”中那樣作為首碼),可以使用模式/\sJava\s/,它要求在單字Java之前和之後都要有空格。但是這樣做有兩個問題:
⑴ 如果“Java”出現在一個字串的開頭或結尾,該模式就不會與之匹配,除非在開頭處或者結尾處有一個空格。
⑵ 當這個模式找到了一個與之匹配的字串時,它返回的匹配字串的前端和後端都有空格,這並不是我們想要的。
因此我們使用單字的邊界\b來代替真正的空格符\s進行匹配。結果運算式是/\bJava\b/。
元素\B將把匹配錨定在不是單字邊界的位置。因此,模式/\B[Ss]cript/與“JavaScript”和“postscript”匹配,但是不與“script”和“Scripting”匹配。
在JavaScript 1.5中,還可以使用任意的Regex作為錨定條件。如果在符號“(?=”和“)”之間加入一個運算式,它就是一個前向聲明,指定接下來的字元必須被匹配,但並不真正進行匹配。例如要匹配一種常用的程式設計語言的名字,但只在其後有冒號時匹配,可以使用/[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”匹配。
下表總結了Regex的錨:
Regex的錨字元
字元 |
含義 |
^ |
匹配字串的開頭,在多行檢索中,匹配一行的開頭 |
$ |
匹配字串的結尾,在多行檢索中,匹配一行的結尾 |
\b |
匹配一個詞語的邊界。簡而言之,就是位於字元\w和\W之間的位置,或位於字元\w和字串的開頭或結尾之間的位置 |
\B |
匹配非詞語邊界的位置 |
(?=p) |
正前向聲明,要求接下來的字元都與模式p匹配,但是不包括匹配中的那些字元。 |
(?!p) |
反前向聲明,要求接下來的字元不與模式p匹配 |