如何使用正则表达式匹配括号内的文本?

时间:2009-08-26 20:29:58

标签: java regex

我有以下模式:

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

我希望最终输出为:

COMPANY ASP,INC。

目前我有以下代码,它不断返回原始模式(我假设因为该组都在第一个'('和最后')'之间落在

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

我正在努力获得我需要的结果并感谢任何帮助。我得到每个小组后,我并不担心连接结果,只需要得到每个小组。

5 个答案:

答案 0 :(得分:28)

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

答案 1 :(得分:6)

你的。*量词是'贪婪',所以是的,它抓住了第一个和最后一个可用括号之间的所有内容。正如混乱所说,简洁:),使用。*?是一个非贪婪的量词,因此它会在保持匹配的同时尽可能少地抓取。

你需要在正则表达式中转义括号,否则它将成为另一个组。假设你的字符串中有字面括号。我怀疑你在初始问题中提到了什么,因为你的模式实际上是你的字符串。

查询:是“公司”,“ASP”和“INC”。 需要

如果你必须有它们的值,那么你想使用+而不是*,+是1或更多,*是零或更多,所以a *将匹配文字字符串“() “

例如:“((。+?))”

答案 2 :(得分: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*\\)+");

答案 3 :(得分:0)

不是您问题的直接答案,但我建议您使用RegxTester快速找到答案和任何未来的问题。它允许您实时测试。

答案 4 :(得分:0)

如果你的字符串总是看起来像那样,那么你只需要使用几个调用来代替replaceAll即可。这似乎对我有用:

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

可能不是世界上最有效的东西,但相当简单。