让我们说
((pre)(expr)(post)?|(pre)?(expr)(post))
这意味着将expr与至少一个前缀或后缀或两者匹配,但两者都不匹配。
preexpr - OK
exprpost - OK
preexprpost - OK
expr - BAD
此示例使用字母,但所有三个子表达式都可以是任何有效的正则表达式,而不仅仅是字母。
有没有办法编写一个等效的正则表达式,每个表达式只出现一次?我试图提高可读性。
现在我知道我可以删除第二次出现的pre
:
((pre)(expr)(post)?|(expr)(post))
但我想知道它是否还能减少。
谢谢
答案 0 :(得分:1)
是 - 这是为条件构造(?(n)yes regex|no regex)
制作的。
在我看来,条件的唯一值是通过或失败 基于 或 匹配的内容匹配。
在这种情况下,以下正则表达式检查可选组1或3是否匹配 实际上,' pre'和'发布'可以是幽默的子表达 (但要注意回溯陷阱)。
这样可以节省多个子表达式。
https://regex101.com/r/QdhRn2/1
(pre)?(expr)(post)?(?(1)|(?(3)|(?!)))
解释
( pre )? # (1), Optional 'pre'
( expr ) # (2), Required 'exp'
( post )? # (3), Optional 'post'
# Post mortum
(?(1) # Did group 1 match ?
| (?(3) # No, then did group 3 match ?
| (?!) # No. Fail the whole thing
)
)
# Here, at least group 1 or 3 matched, possibly both
( pre )? # (1), Optional 'pre'
( expr ) # (2), Required 'exp'
( post )? # (3), Optional 'post'
# Post mortum
(?(1) # Did group 1 match ?
# Yes, all done
| # or,
(?(3) # No, then did group 3 match ?
# Yes, all done
| # or,
(?!) # No. Fail the whole thing
)
)
# Here, at least group 1 or 3 matched, possibly both