1.正向預查
現在,我們假設需要僅匹配 Windows,不匹配后面的版本號,並且要求 Windows 后面的版本號只能是 數字類型,換言之,XP 和 Vista 不能被匹配,
在正則表達式中,可以使用 正向預查 來解決這個問題。本例中,寫法是:“Windows(?= [\d.]+\b)”。
它的語法是在 子模式內部 前面加“?=”,表示的意思是:首先,要匹配的文本必須滿足此子模式前面的表達式(本例,“Windows ”);其次,此子模式不參與匹配。
Text:
Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively.
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
RegEx:
Windows( ?=[\d.]+\b)
Result:(帶下划線的為成功匹配的)
Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively.
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
可以將 正向預查 理解成為自定義的邊界(\b),這個邊界位於表達式末。
反言之,你可以將位於表達式末的 \b 理解成非獲取匹配的一個特例:(?=[ ,.\r\n<>;\-])。注意,這里沒有寫全邊界符號。
Text:
aaaax-aaa
aaaaxaaaa
RegEx:
x(?=[,.\r\n<>;\-])
Result:
aaaax-aaa
aaaaxaaaa
你也可以這樣理解上面的匹配過程:
1. 先進行普通匹配:Windows ([\d.]+\b)
2. 然后從匹配文本中將 子模式 內的文本排除掉。
2.反向預查
在上面的例子中,我們知道 正向預查 類似於自定義的 位於文本末 的字符邊界。那么自然應該有位於文本首的情況,比如說,我們要匹配下面文本中屬於 CNY 的金額:
Text:
CNY: 128.04
USD: 22.5
USD: 23.5
HKD: 1533.5
CNY: 23.78
RegEx:
CNY: \d+\.\d+
Result:
CNY: 128.04
USD: 22.5
USD: 23.5
HKD: 1533.5
CNY: 23.78
與上面類似,我們現在要求僅匹配金額,而不匹配前面的 “CNY:”
正則表達式中,可以使用 反向預查 來解決這個問題。本例中,寫法是:(?<=CNY: )\d+\.\d+
反向預查 的語法是在子模式內部前面加“?<=”,表示的意思是:首先,要匹配的文本必須滿足此子模式 后面 的表達式(本例,“\d+.\d+”);其次,此子模式不參與匹配。
Text:
CNY: 128.04
USD: 22.5
USD: 23.5
HKD: 1533.5
CNY: 23.78
Page 39 of 42
RegEx:
(?<=CNY: )\d+\.\d+
Result:
CNY: 128.04
USD: 22.5
USD: 23.5
HKD: 1533.5
CNY: 23.78
與前面類似:你可以將 反向預查 理解成為自定義的邊界(\b),這個邊界位於 表達式首。
反言之,你可以將位於 表達式首 的 \b 理解成一個非獲取匹配的一個特例:(?<=[ ,.\r\n<>;\-])。注意,我沒有寫全所有邊界。
Text:
aaa-xaaaa
aaaxaaaaa
RegEx:
(?<=[,.\r\n<>;\-])x
Result:
aaa-xaaaa
aaaxaaaaa
你也可以這樣理解上面的匹配過程:
1. 先進行普通匹配:(CNY: )\d+\.\d+
2. 然后從匹配文本中將 子模式 內的文本排除掉。