一、 前瞻后顾
1. 含义
表达式 | 含义 | 常用实例 | ||
---|---|---|---|---|
非捕获组 | (?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如"industr(?:y|ies)"就是一个比“industry|industries" 更简洁的表达式 | ||
前瞻 | 肯定式向前查找 | (?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|200)"能匹配"Windows2000”中的“Windows",但不能匹配"Windows3.1" 中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 | |
负前瞻 | 否定式向前查找 | (?!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)$ 不以某字符串结尾 /.*(?<!end)$/ |
2. ?: 与?= 区别
-
共同点
(?:pattern)
与(?=pattern)
都匹配pattern,但不会把pattern结果放到Matches的集合中 -
区别
-
(?:pattern)
匹配得到的结果包含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))
-
-
是否消耗字符
(?:pattern)
消耗字符,下一字符匹配会从已匹配后的位置开始。
(?=pattern)
不消耗字符,下一字符匹配会从预查之前的位置开始。
即后者只预查,不移动匹配指针。如:
3. 常用例子
正则表达式 | 含义 |
---|---|
(?<=").*?(?=") | 匹配引号中间的值 |
二、贪婪模式与非贪婪模式
含义
- 贪婪与非贪婪模式影响的是的匹配行为.
- 贪婪模式在的前提下,尽可能的匹配.
- 而非贪婪模式在的前提下,尽可能的匹配.
贪婪模式量词 | 非贪婪模式量词(懒惰模式或惰性模式) |
---|---|
{m,n} | {m,n}? |
{m,} | {m,}? |
? | ?? |
* | *? |
+ | +? |
示例
源字符串 | 正则表达式 | 匹配结果 |
---|---|---|
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)的区别
正则基础之——NFA引擎匹配原理
正则表达式 - 字符匹配不以某字段开头或者结尾
正则基础之——贪婪与非贪婪模式
深入理解正则表达式环视的概念与用法