2013-04-17 29 views
4

我正在使用Java Pattern類進行一些字符串搜索。 我想匹配包含「C++」或「c#」內部使用java模式類的字符串(txt)。正則表達式搜索包含+或#的字符串使用Java

String txt="c++/c# developer"; 
Pattern p = Pattern.compile(".*\\b(c\\+\\+|c#)\\b.*" , Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(txt); 
while (m.find()) { 
... 
    break; 
} 

m.find總是假 我到底做錯了什麼? 謝謝 Ofer

+0

將一個樣品文字和樣品的結果。 – NINCOMPOOP

回答

0

您可以嘗試使用^.*c(\+{2}|\#).*$。它說找到一個c,然後是2 +#。你可以看到一個例子here

+0

您應該至少在使用適當引擎的測試程序中提供演示鏈接:http://www.regexplanet.com/advanced/java/index.html –

+0

@ m.buettner書籤,我將使用它用於所有Java正則表達式的例子在未來。 Rubular是我使用過的最乾淨/最新的一個,因此我使用那個作爲快速示例。謝謝。 – Walls

6

\\b是一個字邊界。這意味着它匹配一個單詞和一個非單詞字符。 +#都是非單詞字符,因此您需要c++c#後跟一個字母,數字或下劃線。嘗試刪除\\b或將其替換爲\\B(這將需要在+#之後有另一個非單詞字符)。

請注意,當您使用find時,您也不需要.*find會很高興地返回部分匹配。你的模式會給你第一個捕獲組的最後一次出現c++c#。如果這不是您想要的,請刪除括號和通配符。

Working demo.

編輯:如果您添加的做單詞字符端(如java)其他替代品。最乾淨的解決方案根本不是使用\\b\\B,而是使用負向預測創建自己的邊界條件。這樣,你只是說:「相匹配,如果有下一個無字的字符」:

\\b(c\\+\\+|c#|java)(?!\\w) 

Working demo.

+0

謝謝,當我使用模式\\ b(c \\ + \\ + | c#| java)\\ B它現在找到C++或c#,但是當我嘗試匹配字符串「java」時,它失敗了之前當我在最後使用\\ b時)。在正則表達式中是否有任何方法將兩種方法混合成一個正則表達式? – user2022561

+0

@ user2022561我已經調整了我的答案以適應 –

+0

我使用了第二個選項,現在它在所有情況下都能夠完美工作。非常感謝您的幫助 – user2022561

相關問題