BEGIN A B C END | A B C
以上正则表达式应匹配BEGIN A B C END
或A 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 C
或BEGIN A B C
或A B C END
或BEGIN A B C END
,有效地匹配比我预期的语言更大的语言。
我是否可以在不扩大语言的情况下更简洁,从而避免为匹配组避免两个不同的组名?
答案 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
匹配