“(”A B C“)”或A B C - 匹配平衡包装或无正则表达式

时间:2013-01-08 20:47:22

标签: java regex regex-group

BEGIN A B C END | A B C

以上正则表达式应匹配BEGIN A B C ENDA B C,而不会被BEGIN和END包围。假设在使用像(?<ImAfterTheA>A)中的命名组一样在A之后,在Java中,您需要为第一个A提供与第二个A不同的组名。

BEGIN (?<ImAfterTheA_1>A) B C END | (?<ImAfterTheA_2>A) B C

所以...我想缩短它并提出:

BEGIN? A B C END?

但是,这将再次匹配A B CBEGIN A B CA B C ENDBEGIN A B C END,有效地匹配比我预期的语言更大的语言。

我是否可以在不扩大语言的情况下更简洁,从而避免为匹配组避免两个不同的组名?

1 个答案:

答案 0 :(得分:0)

这个正则表达式符合我的想法:

(BEGIN A B C END)| ((?<!BEGIN) A B C (?!END))

这与两端的BEGIB和END匹配两端都不是BEGIN或END。换句话说,如果其中一个包装器存在,则两者都必须存在。

  • BEGIN A B C END匹配
  • foo A B C END不匹配
  • BEGIN A B C foo不匹配
  • foo A B C bar匹配