Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用正则表达式匹配括号内的文本?_Java_Regex - Fatal编程技术网

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

Java 如何使用正则表达式匹配括号内的文本?,java,regex,Java,Regex,我有以下模式: (COMPANY) -277.9887 (ASP,) -277.9887 (INC.) 我希望最终输出为: ASP公司 目前,我有以下代码,它一直返回原始模式(我假设,因为组都位于第一个“(”和最后一个“)”之间) 我正在努力获得我需要的结果,并感谢任何帮助。我不担心在得到每个组后将结果连接起来,只需要得到每个组。不是对您的问题的直接回答,但我建议您使用它快速找到答案和任何未来的问题。它允许您实时测试。您的。*数量它是“贪婪的”,所以是的,它抓住了第一个和最后一个可用括号之间

我有以下模式:

(COMPANY) -277.9887 (ASP,) -277.9887 (INC.) 
我希望最终输出为:

ASP公司

目前,我有以下代码,它一直返回原始模式(我假设,因为组都位于第一个“(”和最后一个“)”之间)


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

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

您的。*数量它是“贪婪的”,所以是的,它抓住了第一个和最后一个可用括号之间的所有内容?是一个非贪婪的量词,因此它将在保持匹配的同时尽可能少地获取

Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL);
您需要在正则表达式中转义括号,否则它将成为另一个组。假设字符串中有文字括号。我怀疑你在最初的问题中提到的模式实际上是你的字符串

问题:是否需要“公司”、“ASP”和“公司”

如果必须为它们设置值,那么您希望使用+而不是*,+为1或更多,*为零或更多,因此*将匹配文本字符串“()”


例如:“((.+?)”

如果您的字符串总是这样,那么只需调用几个replaceAll即可。这似乎对我有用:

String eName = "(COMPANY) -277.9887 (ASP,) -277.9887 (INC.)";
        String eNameEdited = eName.replaceAll("\\).*?\\("," ").replaceAll("\\(|\\)","");
        System.out.println(eNameEdited);
可能不是世界上最高效的东西,但相当简单。

使用Java 8测试: /***下面的模式返回括号内的字符串

* 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*\\)+");

混乱,你真厉害!我从未想过尝试这种模式,它完全符合我的需要。感谢您抽出时间回答!这是一个很好的提示,谢谢,只有当它们之间有一个值时,我才会有()。但我会为将来做标记。谢谢在组匹配中,您可以而且可能应该尝试比“.”更具体。如果字符串应该只有大写字母,也可能是带插图的标点符号,那么您可以尝试类似“\(([A-Z,.]+?)\”的内容。通过这种方式,不可靠的数据至少会被注意到,并且可以被纠正。尽管它支持.NET正则表达式,但不支持java。
* 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*\\)+");