本文實例講述了正規表示式教程之位置匹配。分享給大家供大家參考,具體如下:
注:在所有例子中正則表達式匹配結果包含在源文本中的【和】之間,有的例子會使用Java來實現,如果是java本身正則表達式的用法,會在對應的地方說明。所有java例子都在JDK1.6.0_13下測試通過。
一、問題引入
如果想匹配一段文本中的某個單字(暫不考慮多行模式,將在後面介紹),我們可能會像下面這樣:
文本:Yesterday is history, tomorrow is a mystery, but today is a gift.
正則表達式:is
結果:Yesterday 【is】 h【is】tory, tomorrow is】 a mystery, but today 【is】a giftrow is】 a mystery, but today 【is】a gift.要配對單字is,但把其他單字中包含的is也配對出來了。要解決這個問題,使用邊界界定符,也就是在正規表示式裡用一些元字元來表示我們想要讓匹配操作在什麼位置(或邊界)發生。
二、單字邊界
一種常用的邊界是由限定符b指定的單字邊界,b用來匹配單字的開始和結尾。更確切地說,它是匹配這樣一個位置,這個位置位於一個能夠用來構成單字的字元(字母、數字、底線,也就是與w相符的字元)和一個不能用來構成單字的字元(與W相符的字元)之間。來看前面的例子:
文本:Yesterday is history, tomorrow is a mystery, but today is a gift.
正則表達式:bisb
結果:Yesterday 【is】 . today 【is】 a gift.
分析:在原始文本中,單字is的前後都有一個空格,而這與模式bisb相符(空格是用來分隔單字的字元之一)。而單字history中也包含了is,因為它的前後分別有一個字符h和t,這兩個字符都不能與b匹配。
如果不符合一個單字邊界,則使用B。如:
文本:Please enter the nine-digit id as it appears on your color - coded pass-key.
正則表達式:B-B
結果:Please enter the 【nine-gitcaetalpoo color - coded 【pass-key】.
分析:B-B將匹配一個前後都不是單字邊界的連字符,nine-digit和pass-key中連字符前後都沒有空格,所以能夠匹配,而color - coded中連字符前後都有空格,所以不能匹配。
三、字串邊界
單字邊界可以用來進行與單字相關的位置配對(單字開頭、結束、整個單字等等)。而字串邊界也有著類似的用途,只不過是用來進行與字串相關的位置匹配(字串開頭、結束、整個字串等等)。用來定義字串邊界的元字元有兩個:一個是用來定義字串開頭的^,另一個是用來定義字串結尾的$。
例如要檢查一個XML文件的合法性,合法的XML文件都以這樣形式開頭:
文本:
<?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="ear"> </project>
正則表達式:^s xml.*??>
結果:
$元字元符的用法除了位置上的差異外,與^用法完全一樣。例如,檢查一個html頁面是否以