我是regex的新手。我找到了解决以下问题的解决方案,但我想知道为什么我的第一个代码段无效:
假设我想与(Python)正则表达式c
,[a]c
或[b]c
匹配(这是MWE,实际上a,b,c代表更复杂的模式)。
我想通了:
不工作剪辑:
^(\[(a)?|(b)?\])?c$
匹配c
,但 匹配[a]c
或[b]c
如果我移除外部可选组\[(a)?|(b)?\]c$
,则它与[a]z
和[b]z
匹配,但不可理解c
我可以通过以下方式解决这个问题:
工作片段
^(\[a\])|(\[b\])?c$
有人可以解释一下为什么最新版本有效且第一个不是吗?
答案 0 :(得分:4)
您应该grouped a
和b
替代方案:
^(\[(?:(a)|(b))\])?c$
^^^ ^
请参阅regex demo。如果您不这样做,则[
仅在a
之前匹配,而]
仅在b
之后匹配。您的正则表达式与[ac
,b]c
,]c
,[c
字符串匹配,请参阅your regex demo和图表:
请参阅下面的固定正则表达式详细信息:
^
- 字符串的开头(
- 第一个捕获组的开始:
\[
- 文字[
(?:
- 非捕获组的开始:
(a)
- 与a
|
- 或(b)
- 与b
)
- 非捕获组的结束\]
- ]
)?
- 第一个捕获组结束,?
使其匹配1或0次c
- c
$
- 字符串结束。固定的正则表达式图:
P.S。这些图表是在https://jex.im/regulex生成的。
答案 1 :(得分:0)
我想如果你想匹配c,[a] c或[b] c,那么你应该使用下面的表达式。
^((\[a\])?|(\[b\])?)?c$
答案 2 :(得分:-1)