正则匹配表达式之原子组
5. 原子组 Atomic group Non-backtracking (greedy) (?>exp)
5.1 示例 (?>a|ab)c
“ac”
(?>a|ab)c
# 输出结果: "ac"
让我们解释为什么正则表达式 (?>a|ab)c
在字符串 “ac” 中匹配成功并输出 “ac”。
正则表达式解析
(?>...)
:非捕获组。这里的?>
表示这是一个独立的非捕获组(Atomic Grouping)。a|ab
:表示要么匹配字符a
,要么匹配字符串ab
。c
:匹配字符c
。
正则表达式工作原理
(?>a|ab)
是一个独立的非捕获组,表示一旦选择了某个分支(a
或ab
),就不再回溯。- 整个正则表达式
(?>a|ab)c
表示匹配a
或ab
,然后紧接着一个c
。
匹配过程
让我们逐步解析这个正则表达式在字符串 “ac” 中的匹配过程:
- 输入字符串:
ac
- 尝试匹配
(?>a|ab)c
- 尝试第一个分支
a
:- 匹配
a
成功,剩余字符串是c
。 - 接下来匹配
c
,成功。 - 完成匹配,输出结果是
ac
。
- 匹配
- 因为
?>
表示独立的非捕获组,一旦选择了a
,就不会回溯到ab
。
- 尝试第一个分支
- 不尝试匹配
ab
:- 因为第一个分支
a
已经成功匹配,并且整个正则表达式已经成功匹配ac
,所以不再尝试ab
。
- 因为第一个分支
结论
正则表达式 (?>a|ab)c
在字符串 “ac” 中成功匹配并输出结果为 “ac”,因为独立的非捕获组 ?>
保证了在选择 a
之后,不会回溯去尝试 ab
,从而成功匹配到整个模式。
5.2 示例 (?>a|ab)c
“abc”
(?>a|ab)c
# 输出结果: 无匹配
让我们解释为什么正则表达式 (?>a|ab)c
在字符串 “abc” 中没有匹配成功。
正则表达式解析
(?>...)
:独立的非捕获组(Atomic Grouping),表示一旦选择了某个分支,就不会回溯。a|ab
:表示要么匹配字符a
,要么匹配字符串ab
。c
:匹配字符c
。
匹配过程
让我们逐步解析这个正则表达式在字符串 “abc” 中的匹配过程:
- 输入字符串:
abc
- 尝试匹配
(?>a|ab)c
- 尝试第一个分支
a
:- 匹配
a
成功,剩余字符串是bc
。 - 接下来尝试匹配
c
:- 字符
b
不匹配c
,因此整个匹配失败。
- 字符
- 匹配
- 因为
(?>a|ab)
是独立的非捕获组,一旦选择了a
,就不会回溯到ab
。 - 因此,不会尝试匹配
ab
。
- 尝试第一个分支
结论
正则表达式 (?>a|ab)c
在字符串 “abc” 中没有匹配成功,因为:
- 在选择
a
并尝试匹配c
时,遇到字符b
,导致匹配失败。 - 独立的非捕获组
(?>a|ab)
不允许在匹配失败后回溯到另一个分支ab
,因此没有机会尝试匹配ab
。
结果是整个正则表达式无法匹配字符串 “abc”。