Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配Java正则表达式中由可选组包围的内容_Java_Regex - Fatal编程技术网

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

匹配Java正则表达式中由可选组包围的内容,java,regex,Java,Regex,我很难理解如何编写特定的Java正则表达式。正则表达式将按顺序使用,并将匹配以/结尾的部分 问题是使用简单的拆分将不起作用,因为/前面的文本可以被~包围。如果是,那么里面的文本可以匹配任何内容,包括/和~。这里的关键是结尾~/,如果它是以~开头的,那么这是跳出“一切正常”序列的唯一方法 由于正则表达式模式将按顺序使用(即(xxx)+),因此我不能使用^或$进行非贪婪匹配 示例匹配: foo/ ~foo~/ ~foo/~/ ~foo~~/ ~foo/bar~/ 还有一些是不匹配的: foo~

我很难理解如何编写特定的Java正则表达式。正则表达式将按顺序使用,并将匹配以
/
结尾的部分

问题是使用简单的拆分将不起作用,因为
/
前面的文本可以被
~
包围。如果是,那么里面的文本可以匹配任何内容,包括
/
~
。这里的关键是结尾
~/
,如果它是以
~
开头的,那么这是跳出“一切正常”序列的唯一方法

由于正则表达式模式将按顺序使用(即
(xxx)+
),因此我不能使用
^
$
进行非贪婪匹配

示例匹配:

  • foo/
  • ~foo~/
  • ~foo/~/
  • ~foo~~/
  • ~foo/bar~/
还有一些是不匹配的:

  • foo~//
  • ~foo~/bar~/
  • ~foo/
  • foo~/
    (参见编辑2)
有没有什么方法可以做到这一点而不与我的正则表达式重复?考虑与此匹配的最佳方式是什么?Java没有条件修饰符(
),所以在我的头脑中,事情会变得复杂一些

编辑:同时处理此操作后,正则表达式
((?:\~())((?!((?!\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~
永远不会匹配,这会使正则表达式成为可能吗;你说得很对。谢谢你指出这个逻辑,;这使我省去了几个小时的头痛虽然这并没有直接回答这个问题,但我仍然将其标记为这样,因为它解释了为什么我编辑的正则表达式会这样做(我可能会补充,这是正确的)。没问题。根本的问题是,表达式的开头不必有任何内容,并且有多个结尾,其中一些结尾也可以用作开头。因此,如果前面正好有一个
~
,就无法判断一个表达式何时结束(至少当您有一个长度未知的字符串时),另一个表达式何时开始。