非捕获型括号"(?:…)"
"(…)“用于分组和捕获,提供反向引用;”(?:…)"表示只分组不捕获,不提供反向引用。
环视
环视结构不匹配任何字符,只匹配文本中的特定位置,即:环视不会“占用”字符。
类型 | 正则式 | 匹配成功的条件 |
---|---|---|
肯定逆序环视 | (?<=…) | 子表达式能够匹配左侧文本(自右向左) |
否定逆序环视 | (?<!..) | 子表达式不能匹配左侧文本(自右向左) |
肯定顺序环视 | (?=…) | 子表达式能够匹配右侧文本(自左向右) |
否定顺序环视 | (?!..) | 子表达式不能匹配右侧文本(自左向右) |
区分基本正则式与扩展正则式
正则式特性 | BREs | EREs |
---|---|---|
+和?量词 | 不支持 | 支持 |
区间量词 | \{min,max\} | {min,max} |
分组 | \(…\) | (…) |
反向引用 | \1到\9 | |
多选结构 | 不支持 | 支持 |
模式修饰符"(?modifier)"
设定匹配模式,如:i,不区分大小写。
模式作用范围"(?modifier:…)"
限制所设定的匹配模块范围。
注释"(?#…)“或”#"
(?#…)常用于不支持宽松排列的情况。
固化分组"(?>…)"
通过固化分组匹配到的内容,它永远不会“交还”已经匹配的任何内容。即使后续匹配失败。
忽略优先量词"*?"、"+?"、"??"、"{min,max}?"
匹配尽可能少的内容,只需要满足下限,匹配就能成功。相当于是反贪婪匹配模式。
占有优先量词"*+"、"++"、"?+"、"{min,max}+"
匹配内容上遵从贪婪匹配,但匹配成功后不会“交还”已经匹配的任何内容。类似于贪婪匹配和固化分组的结合。
正则匹配引擎
NFA:表达式主导
DFA:文本主导
NFA与DFA匹配最直观的差异在于处理多选结构的区别,NFA将多选结构作为独立的正则式处理,相当于线性匹配方式,DFA将多选结构潜在的可能做并行处理,相当于并行匹配方式。
NFA匹配速度与正则式相关,DFA匹配速度与正则式无关,对于复杂的正则式如果使用NFA引擎匹配,要做好正则式优化工作,否则可能长时间甚至不能成功匹配。
NFA在能力上较DFA具有一定优势,如:反向引用,环视,占有优先量词,固化分组。
现在许多工具已经糅合了NFA和DFA。
正则式性能优化
- 将匹配权重高的表达式放到左侧,优先执行,主要是提高准确度和效率。如:具有一票否定权的。这一点类似于提高C/C++分支结构执行效率。
- 限制匹配优先的作用范围,用量词限制。
- 能够使用[…]解决就不使用多选结构,减少匹配过程中的回溯次数。
- 避免出现指数级正则式匹配,单个量词“迭代”次数不应该比目标字符串的字符数量更多。
- 避免重新编译。
- 使用非捕获型括号,如果不需要反向引用。
- 不要滥用括号。
- 不要滥用字符组。
- 使用起始锚点。
- 尽可能的将文字文本独立出来。