2016-09-21 100 views
2

我試圖提取特定序列使用下述正則表達式字符串:如果字符串包含()與他們之間的文本Java:正則表達式不匹配?

[(].*[)] 

我的模式應該只匹配。

不知怎的,我創建一個新的Pattern使用Pattern#compile(myString)再搭配使用Matcher matcher = myPattern.matcher();沒有找到任何字符串,即使我試圖在regexr.com,並在那裏工作。

Pattern是在另一個類static final Pattern對象(我​​直接用Pattern#compile(myString)

示例串匹配:。

save (xxx,yyy) 
+0

你應該包括你的代碼的一部分 –

+0

請說是否你想**匹配**或**提取** – TheLostMind

+0

什麼_doesn't找到anything_是什麼意思? - 你正在使用_matches()_或_find()_嗎? – Alexander

回答

1

這裏的可能的問題是你的量詞

既然你'使用貪婪*.的組合爲任何字符,您的匹配將不會正確劃分爲.也將匹配closin g )

嘗試使用不情願[(].*?[)]

查看量詞在docs

您可以逃生括號,而不是使用自定義字符類,像這樣:\\(\\),但是這無關你的問題。

還要注意(感謝esprittn

  • *量詞匹配0+字符,所以如果你想限制你的比賽,以非空括號,使用.+?代替 - 這將在保證圓括號內至少有一個字符。
+1

與[(]。*?[)],空括號類似()將匹配,所以用* – esprittn

+0

@esprittn替換*好點。讓我補充一點。 – Mena

0

希望下面的代碼有助於:它提取包含它們的'('&')'之間的數據。

String pattern = "\\(.*\\)"; 
    String line = "save(xx,yy)"; 
    Pattern TokenPattern = Pattern.compile(pattern); 

    Matcher m = TokenPattern.matcher(line); 
    while (m.find()) { 

     int start = m.start(0); 
     int end = m.end(0); 

     System.out.println(line.substring(start, end)); 

    } 

以去除括號變化「開始」到「開始+ 1」和「end」到「端-1」以改變正在採取的子串的邊界索引。