匹配Java正则表达式中可选组包围的内容

时间:2013-07-02 15:57:55

标签: java regex

我无法理解应该如何编写特定的Java正则表达式。正则表达式将在序列中使用,并匹配以/结尾的部分。

问题是使用简单拆分不起作用,因为/之前的文本可以选择由~包围。如果是,则内部文本可以匹配任何内容 - 包括/~。这里的关键是结尾~/,如果它以~开头,这是逃避这个“任何事情”序列的唯一方法。

因为正则表达式模式将用于序列(即(xxx)+),所以我无法使用^$进行非贪婪匹配。

示例匹配:

  • foo/
  • ~foo~/
  • ~foo/~/
  • ~foo~~/
  • ~foo/bar~/

以及一些不匹配的内容:

  • foo~//
  • ~foo~/bar~/
  • ~foo/
  • foo~/(参见编辑2)

有没有办法做到这一点,而不是多余的我的正则表达式?考虑匹配这个的最佳方法是什么? Java没有条件修饰符(?),所以我脑子里的东西更复杂了。

编辑:在此期间处理此问题后,正则表达式((?:\~())?)(((?!((?!\2)/|\~/)).)+)\1/ gets close但#6不匹配。

编辑2 :史蒂夫指出存在歧义之后,很明显#6应该不匹配。

1 个答案:

答案 0 :(得分:1)

我认为这不是一个可以解决的问题。从您的数量来看,这些都是可以接受的:

~foo/~/
~foo/
foo~/

所以,现在,让我们考虑一下这个组合:

~foo/foo~/

这里发生了什么?我们结合了第二个示例和第三个示例来创建第一个示例的实例。你如何建议正确分裂?据我所知,没有办法告诉我们是否应该将整个表达式作为一个两个有效表达式。因此,我认为不可能根据您列出的限制准确地分解它。