六、SubExpression
SubExpression是子表達式的意思,將正則表達式分層,一個表達式中可以包含子表達式,SubExpression用圓括號()來分隔,()內的表達式作為一個個體來對待,考慮下面這個例子。
文本:
Hello, my name is Ben Forta, and I am the author of books on SQL, ColdFusion, WAP,Windows 2000, and other subjects.
正則表達式:
{2}
匹配結果:
Hello, my name is Ben Forta, and I am the author of books on SQL, ColdFusion, WAP,Windows 2000, and other subjects.
說明:為什麼會沒匹配到呢?因為{2}只修飾其前一個描述符,也就是
;
,所以這樣是匹配不到的。但是如果正則表達式是:
( ){2}
則匹配結果為:
Hello, my name is Ben Forta, and I am the author of books on SQL, ColdFusion, WAP,Windows 2000, and other subjects.
子表達式的嵌套與枚舉
SubExpression是可以嵌套的,看下面這個例子。
假設我們要匹配一段文字中的考試成績,這個成績是百分制的數字,小數位最多只有一位,且必須是0.5,假設文本如下:
小明的考試成績是95.5,小華的考試成績是100,小劉的成績是32,小張的成績是76.3。
正則表達式:
((0|[1-9][/d])(/.5))|(0|[1-9][/d])|100
那麼匹配結果是:
小明的考試成績是95.5,小華的考試成績是100,小劉的成績是32,小張的成績是76.3。
說明:多外並列的多選一的subexpression之間用
|
隔開,表示或者的意思。
七、前引匹配
請看下面這個例子。
文本:
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
正則表達式:
<[hH][1-6]>.*?</[hH][1-6]>
匹配結果:
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
很明顯,顯後一行<H2>This is not valid HTML</H3>的匹配結果不是我們想要的,因為它是以<H2>開頭卻以</H3>結尾。
那麼如果要做這一點,正則表達式該如何寫呢?
可以這樣寫:
<[hH]
([1-6])
>.*?</[hH]
/1
>
那麼這樣的話,上述例子的匹配結果就是:
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
說明:
/1
表示參照引用前面表達式中的第一個subexpression,如果是
/2
,就表示參照引用前面表達式中的第二個subexpression.可以看出上述例子中
/1
參照引用了
([1-6])
,這個
“
參照引用
”
含有一個順序一致的意思,就是說,如果
([1-6])
匹配的是1,那麼這裡也只能匹配1,如果
([1-6])
匹配的是2,這裡也只能匹配2。
八、頭尾條件匹配
舉例說文本:
<title>some words</title>
我只想要匹配以<title>開始,並以</title>結束的內容,但匹配的結果不要包含<title>和</title>本身。那麼,正則表達式可以這樣寫:
(
?<=
<title>).*(
?=
</title>)
這樣的話匹配結果就是:
<title>some words</title>
說明:
?<=
後跟著的是匹配的結果的前置內容,
?=
跟著的是匹配結果的後置內容。而且,如果前置或後置內容是多個字符的話,請用()將其包起來。
相反的情況
好,那麼我們很自然的會想到,我要匹配不以<title>和</title>為起始的內容。這時,用另外兩個語法符號:
(?!)和(?<!)
如下例。
文本:
<title>some words</title>
<body>some words</body>
正則表達式:
(
?<!
<title>).*(
?!
</title>)
匹配結果如下:
<title>some words</title>
<body>some words</body>