匹配至少有一个前缀 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

Explained Verbose

 ( 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