【问题标题】:"(" A B C ")" or A B C - match the balanced wrapper or none regexp"(" A B C ")" 或 A B C - 匹配平衡包装或无正则表达式
【发布时间】:2013-01-08 20:47:22
【问题描述】:
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,有效匹配比我预期的更大的语言。

我能否在不扩大语言范围的情况下更简洁,从而避免匹配组使用两个不同的组名?

【问题讨论】:

  • 我真的不明白你的问题。
  • 这个问题几乎没有意义。更具体。
  • 你的第二个正则表达式没有做你认为应该做的事情。
  • 您的意思是,它应该同时具有 BEGIN 和 END 还是两者都没有?在这种情况下,只有第一个会做。
  • 好吧,没有BEGIN就没有END

标签: java regex regex-group


【解决方案1】:

这个正则表达式做我认为你想要的:

(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匹配

【讨论】:

  • 这比(BEGIN A B C END)|(A B C) 好多少?更具体地说(根据操作员的要求)它如何更简洁
  • @Madbreaks 更好,因为它不会匹配 BEGIN A B C foo
  • 这很有趣。左边有必要吗?
  • @panny 是的,这是必要的。有一瞬间我以为不是,但确实如此。
  • @Bohemian 等一下……这看起来令人难以置信。看起来你的天才做得很好:)
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 2015-02-20
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多