12.定位符
到現在為止,所看到的示例都只考慮查找任何地方出現的章節標題。出現的任何一個字符串 'Chapter' 後跟一個空格和一
個數字可能是一個真正的章節標題,也可能是對其他章節的交叉引用。由於真正的章節標題總是出現在一行的開始,因此
需要設計一個方法只查找標題而不查找交叉引用。
定位符提供了這個功能。定位符可以將一個正則表達式固定在一行的開始或結束。也可以創建只在單詞內或只在單詞的開
始或結尾處出現的正則表達式。下表包含了正則表達式及其含義的列表:
字符 描述
^ 匹配輸入字符串的開始位置。如果設置了RegExp對象的 Multiline 屬性,
^ 也匹配 '\n' 或 '\r' 之後的位置。
$ 匹配輸入字符串的結束位置。如果設置了RegExp對象的 Multiline 屬性,
$ 也匹配 '\n' 或 '\r' 之前的位置。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。
\B 匹配非單詞邊界。
不能對定位符使用限定符。因為在一個換行符或者單詞邊界的前面或後面不會有連續多個位置,因此諸如 '^*' 的表達式
是不允許的。
要匹配一行文字開始位置的文字,請在正則表達式的開始處使用 '^' 字符。不要把 '^' 的這個語法與其在括號表達式中
的語法弄混。它們的語法根本不同。
要匹配一行文字結束位置的文字,請在正則表達式的結束處使用 '$' 字符。
要在查找章節標題時使用定位符,下面的 Visual Basic Scripting Edition 正則表達式將匹配位於一行的開始處最多有
兩個數字的章節標題:
/^Chapter [1-9][0-9]{0,1}/
VBScript 中相同功能的正則表達式如下:
"^Chapter [1-9][0-9]{0,1}"
一個真正的章節標題不僅出現在一行的開始,而且這一行中也僅有這一個內容,因此,它必然也位於一行的結束。下面的
表達式確保所指定的匹配只匹配章節而不會匹配交叉引用。它是通過創建一個只匹配一行文字的開始和結束位置的正則表
達式來實現的。
/^Chapter [1-9][0-9]{0,1}$/
對 VBScript 則使用:
"^Chapter [1-9][0-9]{0,1}$"
匹配單詞邊界有少許不同,但卻給正則表達式增加了一個非常重要的功能。單詞邊界就是單詞和空格之間的位置。非單詞
邊界就是其他任何位置。下面的 Visual Basic Scripting Edition 表達式將匹配單詞 'Chapter' 的前三個字符,因為它
們出現在單詞邊界後:
/\bCha/
對 VBScript 為:
"\bCha"
這裡 '\b' 操作符的位置很關鍵。如果它位於要匹配的字符串的開始,則將查找位於單詞開頭處的匹配;如果它位於改字
符串的末尾,則查找位於單詞結束處的匹配。例如,下面的表達式將匹配單詞 'Chapter' 中的 'ter',因為它出現在單詞
邊界之前:
/ter\b/
以及
"ter\b"
下面的表達式將匹配 'apt',因為它位於 'Chapter' 中間,但不會匹配 'aptitude' 中的'apt':
/\Bapt/
以及
"\Bapt"
這是因為在單詞 'Chapter' 中 'apt' 出現在非單詞邊界位置,而在單詞 'aptitude' 中位於單詞邊界位置。非單詞邊界
操作符的位置不重要,因為匹配與一個單詞的開頭或結尾無關。