正则表达式无法按预期工作 - JAVA

时间:2015-06-29 21:07:28

标签: java regex

我正在使用以下正则表达式 "location in \\((.*?)\\)"

针对以下字符串: pro 300 \ nlocation in(“aaa”,“bbb”)

根据java的在线正则表达式测试,结果应该是 “aaa”,“bbb” 但是当我在java代码中运行时,这样:

conditions.replaceAll("location in \\((.*?)\\)", "$1");

pro 300“aaa”,“bbb”

我做错了什么?提前谢谢。

2 个答案:

答案 0 :(得分:7)

replaceAll()正在替换正则表达式conditions匹配的group(0)部分。

要仅检索您需要使用的(...)内的部分:

Pattern p = Pattern.compile("location in \\((.*?)\\)");
Matcher m = p.matcher(conditions);
if (m.find())
{
    String s = m.group(1);
}

这将检索正则表达式(.*?)

的内括号

答案 1 :(得分:2)

除了Rossiar的回答,如果您不想使用PatternMatcher类,只想使用replaceAll方法,那么您的代码正在按预期工作< / strong>,你有以下字符串:

pro 300\nlocation in ("aaa","bbb")
         ^^^^^^^^^^^^^^^^^^^^^^^^^ and you replace this by "aaa","bbb"

所以,你的最后一个字符串是:

pro 300\n"aaa","bbb"

String.replaceAll

如果您只想使用"aaa","bbb"获取replaceAll,则必须使用以下内容匹配整个字符串:

conditions = conditions.replaceAll(".*location in \\((.*?)\\).*", "$1");
                                    ^--------- Note ---------^

或者您可以使用的特定字符串:

"pro 300\nlocation in (\"aaa\",\"bbb\")".replaceAll(".*\\((.*?)\\).*", "$1");

如果\n.*没有匹配,我现在无法测试,所以如果不匹配则可以使用single line标记替换多行或执行操作一个正则表达式的技巧:

单行标志

"pro 300\nlocation in (\"aaa\",\"bbb\")".replaceAll("(?s).*\\((.*?)\\).*", "$1");

<强> Working demo

正则表现技巧

"pro 300\nlocation in (\"aaa\",\"bbb\")".replaceAll("[\\s\\S]*\\((.*?)\\)[\\s\\S]*", "$1");

<强> Working demo