3. 已命名捕獲組(Named Groups)
當(dāng)在一個表達式內(nèi)多次用到回調(diào)引用時,很容易就把事情搞混淆,要弄清那些數(shù)字(1 … 9)都代表哪一個子內(nèi)容是件很麻煩的事。回調(diào)引用的一個替代方法是使用帶名字的捕獲組(下文簡稱“有名組”)。有名組使用(?P<name>pattern) 來設(shè)定,name代表組名,pattern是配合該有名組的正則結(jié)構(gòu)。請看下面的例子:
/(?P<quote>"|').*?(?P=quote)/
上式中,quote就是組名,"|' 是改組匹配內(nèi)容的正則。后面的(?P=quote)是在調(diào)用組名為quote的有名組。這個式子的效果和上面的回調(diào)引用實例一樣,只不過是用了有名組來實現(xiàn)。是不是更加易讀易懂了?
有名組也能用于處理已匹配內(nèi)容之?dāng)?shù)組的內(nèi)部數(shù)據(jù)。賦予特定正則的組名也能作為所匹配到的內(nèi)容在數(shù)組內(nèi)部的索引詞。
preg_match( '/(?P<quote>"|\')/' , " 'String' ", $matches );
# 下面的語句輸出“'”(不包括雙引號)
echo $matches [1];
# 使用組名調(diào)用,也會輸出“'”
echo $matches [ 'quote' ];
所以,有名組并不只是讓寫代碼更容易,它也能用于組織代碼。
4. 字詞邊界(Word Boundaries)
字詞邊界是字串里的字詞字符(包括字母、數(shù)字和下劃線,自然也包括漢字)和非字詞字符之間的位置。其特殊之處就在于,它并不匹配某個實在的字符。它的長度是零。 \b 匹配所有字詞邊界。
不幸的是,字詞邊界一般都被忽視掉了,大部分人都沒有在意他的現(xiàn)實意義。 例如,如果你想要匹配單詞“import”:
/import/
注意了!正則表達式有時候很調(diào)皮的。下面的字串也能和上面的式子匹配成功:
important
你或許覺得,只要在import前后加上空格,不就可以匹配這個獨立的單詞了:
/ import /
那如果遇上這種情況呢:
The trader voted for the import
當(dāng) import 這個詞在字串開頭或者結(jié)尾時,修改后的表達式仍然不能用。因此,考慮各種情況是必須的:
/(^import | import | import$)/i
別慌,還沒完呢。如果遇到標(biāo)點符號了呢?就為了滿足這一個單詞的匹配,你的正則可能就需要這樣寫:
/(^import(:|;|,)? | import(:|;|,)? | import(\.|\?|\!)?$)/i
對于只匹配一個單詞來說,這樣做實在是有點大動干戈了。正因如此,字詞邊界才顯得意義重大。要適應(yīng)上述要求,以及很多其他情況變種,有了字符邊界,我們所需寫的代碼只是:
/\bimport\b/
上面所有情況都得到了解決。 \b 的靈活性就在于,它是一個沒有長度的匹配。它只匹配兩個實際字符之間想象出的位置。它檢查兩個相鄰字符是否是一個為單字,另一個為非單字。情況符合,就返回匹配。如果遇到了單詞的開頭或結(jié)尾, \b 會把它當(dāng)成是非單詞字符對待。由于import里面的 i 仍然被看成是單詞字符,import 就被匹配出來了。
注意,與\b 相對,我們還有\B ,此操作符匹配兩個單字或者兩個非單字之間的位置。因此,如果你想匹配在某個單詞內(nèi)部的‘hi’,可以使用:
\Bhi\B
“this”、“hight”,都會返回匹配,而“hi there”則不會返回匹配。
出處:笨活兒
責(zé)任編輯:bluehearts
上一頁 正則表達式高級技巧及實例詳解 [2] 下一頁 正則表達式高級技巧及實例詳解 [4]
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|