2009-08-26 55 views
10

我有以下模式:如何使用正則表達式在括號內匹配文本?

(COMPANY) -277.9887 (ASP,) -277.9887 (INC.) 

我想最終的輸出是:

公司ASP,INC

目前,我有下面的代碼和它保持返回原來的模式(我認爲,因爲該組的所有介於第一「(」和最後一個「)」

Pattern p = Pattern.compile("((.*))",Pattern.DOTALL); 
Matcher matcher = p.matcher(eName); 
while(matcher.find()) 
{ 
    System.out.println("found match:"+matcher.group(1)); 
} 

我努力讓我需要的結果並感謝任何幫助。我不擔心在獲得每個組後,將結果連接起來,只需要獲得每個組。

回答

28
Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL); 
+0

混亂,你搖滾!我從來沒有想過要嘗試這種模式,它完全按照我的需要工作。感謝您花時間回答! – northpole 2009-08-26 20:40:10

+0

不客氣。 :) – chaos 2009-08-26 20:44:34

0

不是直接回答你的問題,但我建議你使用RegxTester得到答案並迅速任何未來的問題。它允許你實時測試。

+0

但它支持.NET正則表達式,而不是java。 – wds 2009-08-27 12:21:44

6

你的量詞是'貪婪的',所以是的,它抓住了第一個和最後一個可用括號之間的所有內容。正如混沌所說,簡潔:),使用。*?是一個非貪婪的量詞,所以它會盡可能少的抓取,同時仍然保持比賽。

而你需要在正則表達式中轉義括號,否則它會成爲另一個組。假設字符串中有字面括號。我懷疑你在最初的問題中提到了什麼,因爲你的模式實際上是你的字符串。

查詢:是「公司」,「ASP」和「INC」。 要求

如果您必須具有它們的值,那麼您希望使用+而不是*,+爲1或更多,*爲零或多個,所以*會匹配字符串「( )」

如:‘((+?))’

+0

這是一個很棒的技巧謝謝,我只會有()如果實際上有一個值之間。但我會爲未來做好準備。謝謝! – northpole 2009-08-26 20:43:03

+0

您可以也可能應該嘗試比''更具體。在你的小組的匹配。如果字符串預計只有大寫字母和可能的圖示標點符號,那麼你可以嘗試類似「\\(([A-Z,。] +?)\\)」。通過這種方式,至少可以注意到有害數據並且可以糾正。 – ptomli 2009-08-26 20:54:06

0

如果你的字符串總是會像她那樣,你可以只用一對夫婦的要求,而不是對的replaceAll脫身。這似乎適用於我:

String eName = "(COMPANY) -277.9887 (ASP,) -277.9887 (INC.)"; 
     String eNameEdited = eName.replaceAll("\\).*?\\("," ").replaceAll("\\(|\\)",""); 
     System.out.println(eNameEdited); 

可能不是世界上最有效的東西,但相當簡單。

1

使用Java 8測試: /** *在Pattern下面返回括號內的字符串。

* Description about casting regular expression: \(+\s*([^\s)]+)\s*\)+ 

* \(+ : Exactly matches character "(" at least once 
* \s* : matches zero to any number white character. 
* (: Start of Capturing group 
* [^\s)]+: match any number of character except ^,) and spaces. 
*) : Closing of capturing group. 
* \s*: matches any white character(0 to any number of character) 
* \)*: Exactly matches character ")" at least once. 


private static Pattern REGULAR_EXPRESSION = Pattern.compile("\\(+\\s*([^\\s)]+)\\s*\\)+"); 
相關問題