正则匹配表达式之原子组

正则匹配表达式之原子组

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) 是一个独立的非捕获组,表示一旦选择了某个分支(aab),就不再回溯。
  • 整个正则表达式 (?>a|ab)c 表示匹配 aab,然后紧接着一个 c

匹配过程

让我们逐步解析这个正则表达式在字符串 “ac” 中的匹配过程:

  1. 输入字符串ac
  2. 尝试匹配 (?>a|ab)c
    • 尝试第一个分支 a
      • 匹配 a 成功,剩余字符串是 c
      • 接下来匹配 c,成功。
      • 完成匹配,输出结果是 ac
    • 因为 ?> 表示独立的非捕获组,一旦选择了 a,就不会回溯到 ab
  3. 不尝试匹配 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” 中的匹配过程:

  1. 输入字符串abc
  2. 尝试匹配 (?>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”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值