2013-01-07 71 views
1

我使用Pattern.compile()來查找一個文本字符串是否包含另外兩個字符串。但它需要在一個正則表達式模式中。Java模式匹配器查找多個字符串

例如,字符串中必須包含「StringOne」和「StringTwo」。

我可以做Pattern.compile("(StringOne StringTwo|StrinTwo StringOne"),但這兩個字符串都很長,我想看看我是否可以壓縮它。

如果我做"(StringOne)?StringTwo(StringOne)?"它會匹配「StringTwo」和「StringOne StringTwo StringOne」。

非常感謝提前。

+1

有什麼錯只用String.contains()兩次? –

+0

它是否需要是一個正則表達式,因爲我可以想到很多不同的方法來實現它,這可能會更有效率? – xagyg

回答

0

使用這個表達式:

^(?=.*\\bStringOne\\b)(?=.*\\bStringTwo\\b) 

這裏使用兩個查找aheads固定到開始輸入的斷言,這兩個字符串出現地方

編輯: 增加的單詞邊界\b爲字符串的結束以防止一個字符串與另一個字符串匹配,儘管這不是問題的明確要求。

+0

請注意,這允許重疊的可能性,而帶有'|'的問題不會。 – nhahtdh

+0

@nhahtdh你說「重疊」是什麼意思?舉一個你的意思的例子。 – Bohemian

+0

如果StringOne是'assortment'而StringTwo是'sort',那麼你的正則表達式將允許''assortment''匹配。 – nhahtdh

0

有速度的問題。 您可能可以使用lookahead來完成此操作,但它的代價很高。在長字符串中,lookaheads是非常廣泛的。

如果字符串很長,更快的方法是做兩個單獨的匹配。

如果你真正需要做的,就用你原來的方式string A string B|String B String A