2009-08-26 54 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*\\)+"); 
相关问题