Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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,我使用Pattern.compile查找文本字符串是否包含两个其他字符串。但它需要在一个正则表达式模式中 例如,字符串中必须包含StringOne和StringTwo 我可以做Pattern.compileStringOne-StringTwo | StrinTwo-StringOne,但两个字符串都很长,我想看看是否可以压缩它 如果我做StringOne?StringTwo StringOne?它将匹配StringTwo和StringOne StringTwo StringOne 使用此正则表

我使用Pattern.compile查找文本字符串是否包含两个其他字符串。但它需要在一个正则表达式模式中

例如,字符串中必须包含StringOne和StringTwo

我可以做Pattern.compileStringOne-StringTwo | StrinTwo-StringOne,但两个字符串都很长,我想看看是否可以压缩它

如果我做StringOne?StringTwo StringOne?它将匹配StringTwo和StringOne StringTwo StringOne

使用此正则表达式:

^(?=.*\\bStringOne\\b)(?=.*\\bStringTwo\\b)
这使用锚定到输入开头的两个look ahead来断言两个字符串都出现在某个地方

编辑:
将单词边界\b添加到字符串的末尾,以防止一个字符串与另一个字符串匹配,尽管这不是问题的明确要求。

存在速度问题。 您可能会使用lookaheads来实现这一点,但这在速度方面代价高昂。在长弦上,lookaheads是非常膨胀的

如果字符串很长,则更快的方法是进行两个单独的匹配


如果您确实需要这样做,请使用您原来的方式字符串A字符串B |字符串B字符串A

注意,这允许重叠的可能性,而问题中带|的不允许重叠。@nhahtdh重叠到底是什么意思?请举例说明您的意思。如果StringOne是分类,StringII是排序,您的正则表达式将允许分类匹配。@NHAHDH那又怎样?我已经为你的评论添加了一个补丁,但我认为这不是必需的。我认为分类应该通过包含排序和分类的字符串的测试。这取决于需求。我只想指出列出所有排列和使用前瞻之间的一个本质区别。只使用String.contains两次有什么不对?它是否需要是正则表达式,因为我可以想出很多不同的方法来实现,这可能更有效?