匹配至少有一个前缀 and/or 一个后缀的表达式而不重复表达式
Match an expression with at least a prefix and/or a postfix without repeating the expressions
假设
((pre)(expr)(post)?|(pre)?(expr)(post))
这意味着将 expr 至少与前缀或后缀或两者匹配,但两者都不匹配。
preexpr - OK
exprpost - OK
preexprpost - OK
expr - BAD
此示例使用字母,但所有三个子表达式都可以是任何有效的正则表达式,而不仅仅是字母。
有没有一种方法可以编写每个表达式只出现一次的等价正则表达式?我正在努力提高可读性。
现在我知道我可以删除第二次出现的 pre
:
((pre)(expr)(post)?|(expr)(post))
但我想知道是否还能减少。
谢谢
YES - 这就是条件结构 (?(n)yes regex|no regex)
的用途。
在我看来,条件的唯一价值是通过或失败
基于确实或不匹配的匹配项。
在这种情况下,下面的正则表达式检查可选组 1 或 3 是否匹配。
实际上,'pre' 和 'post' 可以是巨大的子表达式
(但要小心回溯陷阱)。
这避免了子表达式的口是心非。
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
假设
((pre)(expr)(post)?|(pre)?(expr)(post))
这意味着将 expr 至少与前缀或后缀或两者匹配,但两者都不匹配。
preexpr - OK
exprpost - OK
preexprpost - OK
expr - BAD
此示例使用字母,但所有三个子表达式都可以是任何有效的正则表达式,而不仅仅是字母。
有没有一种方法可以编写每个表达式只出现一次的等价正则表达式?我正在努力提高可读性。
现在我知道我可以删除第二次出现的 pre
:
((pre)(expr)(post)?|(expr)(post))
但我想知道是否还能减少。
谢谢
YES - 这就是条件结构 (?(n)yes regex|no regex)
的用途。
在我看来,条件的唯一价值是通过或失败
基于确实或不匹配的匹配项。
在这种情况下,下面的正则表达式检查可选组 1 或 3 是否匹配。
实际上,'pre' 和 'post' 可以是巨大的子表达式
(但要小心回溯陷阱)。
这避免了子表达式的口是心非。
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