au3 正则参考 -72-非回溯子表达式
<!DOCTYPE html>
非回溯子表达式 (?>子表达式 )
非回溯子表达式也称为一个贪婪的子表达式, 子表达式为任何有效的正则表达式模式.
通常, 如果正则表达式包含一个可选匹配模式, 并且可选模式不成功的话, 正则表达式引擎可以在多个方向上分支, 以将输入的字符串与某种模式进行匹配. 如果未找到第一个分支的匹配项, 则正则表达式引擎可以使用备份的第一个匹配项的点, 并尝试使用第二个分支的匹配项. 此过程可继续进行, 直到尝试所有分支. 这就是回溯
(?>子表达式 ) 禁用回溯. 正则表达式引擎将在输入字符串中匹配尽可能多的字符. 在没有任何进一步匹配可用时, 它将不回溯尝试可选模式匹配. (也就是说, 非回溯仅仅匹配由非回溯子表达式匹配的字符串; 不会尝试匹配与基于该子表达式其后跟随的任何该子表达式. )
如果你知道回溯不会成功, 则建议使用此选项. 防止正则表达式引擎执行不需要的搜索, 以提高搜索性能.
下面的示例回溯与非回溯如何修改模式匹配的结果. 回溯能匹配单词边界后的一系列重复(相同)字符, 但非回溯则不会匹配.
字符串: cccd, aaad, aaaa
回溯表达式: (\w)\1+.\b
匹配结果(标志 4):
[0]=> [0]cccd
[1]=> [0]aaad
[2]=> [0]aaaa -- 回溯匹配的结果, 非回溯表达式则不会匹配.
非回溯表达式: (?>(\w)\1+).\b
匹配结果(标志 4):
[0]=> [0]cccd
[1]=> [0]aaad
表达式分析:
模式 | 说明 |
---|---|
(?>(\w)\1+) | 非回溯定义. 匹配一个或多个有重复字符的单词, 但不执行回溯 ( 不匹配单词边界上的最后一个单词 aaaa ). |
(\w) | 匹配一个单词字符. 重复匹配到单词边界结束一个匹配过程 . |
\1+ | 一次或多次匹配 (\w) 捕获的子字符值. 并保存到捕获组 \1 . |
. | 匹配任意字符. |
\b | 在单词边界处结束匹配. |
以下示例分别使用 2 个正则表达式模式匹配方法显示匹配信息.
第一个方法调用 \b(?((\w+),?\s?)+[.!?])? 使用有关已捕获的子字符串的信息完全填充捕获收集和集合对象.
第二个方法使用 \b(?((?>\w+),?\s?)+[.!?])? 设置非回溯的捕获调用, 所以它不会捕获有关组的信息.
字符串: This is the first sentence. Is it the beginning of a literary masterpiece? I think not. Instead, it is a nonsensical paragraph
回溯表达式: \b(?((\w+),?\s?)+[.!?])?
匹配结果(标志 4): 返回 12 项
[0]=> [0]This is the first sentence!
[0]=> [1]sentence
[0]=> [2]sentence 非回溯表达式不会匹配.
[1]=> [0]Is it the beginning of a literary masterpiece?
[1]=> [1]masterpiece
[1]=> [2]masterpiece 非回溯表达式不会匹配.
[2]=> [0]I think not.
[2]=> [1]not
[2]=> [2]not 非回溯表达式不会匹配.
[3]=> [0]Instead, it is a nonsensical paragraph.
[3]=> [1]paragraph
[3]=> [2]paragraph 非回溯表达式不会匹配.
非回溯表达式: \b(?((?>\w+),?\s?)+[.!?])?
匹配结果(标志 4): 返回 8 项
[0]=> [0]This is the first sentence!
[0]=> [1]sentence
[1]=> [0]Is it the beginning of a literary masterpiece?
[1]=> [1]masterpiece
[2]=> [0]I think not.
[2]=> [1]not
[3]=> [0]Instead, it is a nonsensical paragraph.
[3]=> [1]paragraph
非回溯表达式分析:
模式 | 子模式 | 说明 |
---|---|---|
\b | 在单词边界处开始. | |
(? | 匹配左括号 “(” 的零或一个匹配项. 源字符串没有 ( 符号, 但测试添加一个 ( 符号, 也不能返回匹配 ? | |
((?>\w+),?\s?)+ | 非回溯定义 (?> . 一次或多次匹配以下子模式的匹配组合. | |
(?>\w+),? | 匹配一个或多个单词字符, 后跟零或一个逗号. 当匹配单词字符不回溯 | |
\s? | 匹配零个或一个空白字符. | |
[.!?])? | 与后无右括号或三个标点符号 . ! ? 中的一个后跟一个右括号 “)” 的匹配 |
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!