一、 前瞻后顧
1. 含義
| 表達式 | 含義 | 常用實例 | ||
|---|---|---|---|---|
| 非捕獲組 | (?:pattern) | 匹配pattern但不獲取匹配結(jié)果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如"industr(?:y|ies)"就是一個比“industry|industries" 更簡潔的表達式 | ||
| 前瞻 | 肯定式向前查找 | (?=pattern) | 正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,"Windows(?=95|98|NT|200)"能匹配"Windows2000”中的“Windows",但不能匹配"Windows3.1" 中的"Windows"。預查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始 | |
| 負前瞻 | 否定式向前查找 | (?!pattern) | 正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)"能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows” | ^(?!str)不以某字符串開頭 /^(?!test).*/ |
| 后顧 | 肯定式向后查找 | (?<=pattern) | 反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows"能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows” | |
| 負后顧 | 否定式向后查找 | (?<!pattern) | 反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 | (?<!str)$ 不以某字符串結(jié)尾 /.*(?<!end)$/ |
2. ?: 與?= 區(qū)別
-
共同點
(?:pattern)與(?=pattern)都匹配pattern,但不會把pattern結(jié)果放到Matches的集合中 -
區(qū)別
-
(?:pattern)匹配得到的結(jié)果包含pattern,(?=pattern)則不包含。如:\\ 對于字符串 " industry abc"
industr(?:y|ies) => industry
industr(?=y|ies) => industrconst str = "industry abc" const reg = /industr(?:y|ies)/ const reg1 = /industr(?=y|ies)/ console.log(str.match(reg)) console.log(str.match(reg1))
-

匹配結(jié)果.png
-
是否消耗字符
(?:pattern)消耗字符,下一字符匹配會從已匹配后的位置開始。
(?=pattern)不消耗字符,下一字符匹配會從預查之前的位置開始。
即后者只預查,不移動匹配指針。如:

匹配過程.png
3. 常用例子
| 正則表達式 | 含義 |
|---|---|
| (?<=").*?(?=") | 匹配引號中間的值 |
二、貪婪模式與非貪婪模式
含義
- 貪婪與非貪婪模式影響的是
的匹配行為.
- 貪婪模式在
的前提下,盡可能
的匹配.
- 而非貪婪模式在
的前提下,盡可能
的匹配.
| 貪婪模式量詞 | 非貪婪模式量詞(懶惰模式或惰性模式) |
|---|---|
| {m,n} | {m,n}? |
| {m,} | {m,}? |
| ? | ?? |
| * | *? |
| + | +? |
示例
| 源字符串 | 正則表達式 | 匹配結(jié)果 |
|---|---|---|
| aa<div>test1</div>bb<div>test2</div>cc | <div>.*</div> | <div>test1</div>bb<div>test2</div> |
| <div>.*?</div> | <div>test1</div> | |
| <div>.*</div>bb | <div>test1</div>bb | |
| <div>.*?</div>cc | <div>test1</div>bb<div>test2</div>cc |
三、參考
正則表達式-- (?:pattern)與(?=pattern)的區(qū)別
正則基礎之——NFA引擎匹配原理
正則表達式 - 字符匹配不以某字段開頭或者結(jié)尾
正則基礎之——貪婪與非貪婪模式
深入理解正則表達式環(huán)視的概念與用法