Java模式匹配器查找多个字符串
我使用Pattern.compile查找文本字符串是否包含两个其他字符串。但它需要在一个正则表达式模式中 例如,字符串中必须包含StringOne和StringTwo 我可以做Pattern.compileStringOne-StringTwo | StrinTwo-StringOne,但两个字符串都很长,我想看看是否可以压缩它 如果我做StringOne?StringTwo StringOne?它将匹配StringTwo和StringOne StringTwo StringOne 使用此正则表达式:Java模式匹配器查找多个字符串,java,regex,Java,Regex,我使用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两次有什么不对?它是否需要是正则表达式,因为我可以想出很多不同的方法来实现,这可能更有效?