我是正则表达式的新手。我找到了解决以下问题的方法,但我想知道为什么我的第一个代码段不起作用:
假设我想匹配 (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$
谁能解释一下为什么这个最新的有效而第一个无效?
请您参考如下方法:
你应该有 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$- 字符串结尾。
一个固定的正则表达式图:
附言这些图表生成于 https://jex.im/regulex .
