匹配Java正则表达式中由可选组包围的内容
我很难理解如何编写特定的Java正则表达式。正则表达式将按顺序使用,并将匹配以匹配Java正则表达式中由可选组包围的内容,java,regex,Java,Regex,我很难理解如何编写特定的Java正则表达式。正则表达式将按顺序使用,并将匹配以/结尾的部分 问题是使用简单的拆分将不起作用,因为/前面的文本可以被~包围。如果是,那么里面的文本可以匹配任何内容,包括/和~。这里的关键是结尾~/,如果它是以~开头的,那么这是跳出“一切正常”序列的唯一方法 由于正则表达式模式将按顺序使用(即(xxx)+),因此我不能使用^或$进行非贪婪匹配 示例匹配: foo/ ~foo~/ ~foo/~/ ~foo~~/ ~foo/bar~/ 还有一些是不匹配的: foo~
/
结尾的部分
问题是使用简单的拆分将不起作用,因为/
前面的文本可以被~
包围。如果是,那么里面的文本可以匹配任何内容,包括/
和~
。这里的关键是结尾~/
,如果它是以~
开头的,那么这是跳出“一切正常”序列的唯一方法
由于正则表达式模式将按顺序使用(即(xxx)+
),因此我不能使用^
或$
进行非贪婪匹配
示例匹配:
foo/
~foo~/
~foo/~/
~foo~~/
~foo/bar~/
foo~//
~foo~/bar~/
~foo/
(参见编辑2)foo~/
?
),所以在我的头脑中,事情会变得复杂一些
编辑:同时处理此操作后,正则表达式((?:\~())((?!((?!\2)/|\~/)+)\1/
,但#6不匹配
编辑2:在Steve指出存在歧义后,很明显#6不应该匹配。我认为这不是一个可以解决的问题。从您的赠品来看,这些都是可以接受的:
~foo/~/
~foo/
foo~/
>现在,让我们考虑这个组合:
~foo/foo~/
这里发生了什么?我们结合了第二个示例和第三个示例来创建第一个示例的实例。您如何建议正确的拆分?据我所知,我们无法判断是否应该将整个表达式作为一个或两个有效表达式。因此,我认为不可能根据您列出的限制准确地将其打破。我认为这不是一个可解决的问题。从您的赠品来看,这些都是可以接受的:
~foo/~/
~foo/
foo~/
>现在,让我们考虑这个组合:
~foo/foo~/
这里发生了什么?我们结合了第二个示例和第三个示例来创建第一个示例的实例。您如何建议正确的拆分?据我所知,我们无法判断是否应该将整个表达式作为一个或两个有效表达式。因此,我认为不可能根据您列出的限制准确地将其分解。为什么是正则表达式而不是返回所需内容的实用方法?我们使用的程序框架需要正则表达式来匹配整个文本。必须是正则表达式。@Qix,请看我的答案。我很可能遗漏了一些东西,但基于你的限制,我认为你的要求实际上是不可能做到的。为什么是正则表达式而不是返回所需内容的实用方法?正则表达式是我们用来匹配整个文本的程序框架所需的。必须是正则表达式。@Qix,请看我的答案。我很可能遗漏了一些东西,但基于您的限制,我认为您的要求实际上不可能实现。请参阅编辑。这是完全可能的。我不想使用
split
;我刚才说在这种特殊情况下,split
不起作用。我理解这一点。我用英语意义上的split。你看到我的回答了吗?是的,您可以匹配正则表达式,但是根据您的规则,上面的组合可以是一个或两个表达式。您可能没有使用split()
,但仍在尝试分离表达式,对吗?我刚刚重新阅读了它。很好。如果我假设~foo
和foo~
永远不会匹配,这会使正则表达式成为可能吗;你说得很对。谢谢你指出这个逻辑,;这使我省去了几个小时的头痛虽然这并没有直接回答这个问题,但我仍然将其标记为这样,因为它解释了为什么我编辑的正则表达式会这样做(我可能会补充,这是正确的)。没问题。根本的问题是,表达式的开头不必有任何内容,并且有多个结尾,其中一些结尾也可以用作开头。因此,如果前面正好有一个~
,则无法判断一个表达式何时结束(至少当您有一个长度未知的字符串时),另一个表达式何时开始。请参阅编辑。这是完全可能的。我不想使用split
;我刚才说在这种特殊情况下,split
不起作用。我理解这一点。我用英语意义上的split。你看到我的回答了吗?是的,您可以匹配正则表达式,但是根据您的规则,上面的组合可以是一个或两个表达式。您可能没有使用split()
,但仍在尝试分离表达式,对吗?我刚刚重新阅读了它。很好。如果我假设~foo
和foo~
永远不会匹配,这会使正则表达式成为可能吗;你说得很对。谢谢你指出这个逻辑,;这使我省去了几个小时的头痛虽然这并没有直接回答这个问题,但我仍然将其标记为这样,因为它解释了为什么我编辑的正则表达式会这样做(我可能会补充,这是正确的)。没问题。根本的问题是,表达式的开头不必有任何内容,并且有多个结尾,其中一些结尾也可以用作开头。因此,如果前面正好有一个~
,就无法判断一个表达式何时结束(至少当您有一个长度未知的字符串时),另一个表达式何时开始。