在Java中使用regexp有什么问题

时间:2015-10-02 13:43:36

标签: java regex

我想得到text2这个词,但它返回null。你能纠正一下吗?

String str = "Text SETVAR((&&text1 '&&text2'))";
Pattern patter1 = Pattern.compile("SETVAR\\w+&&(\\w+)'\\)\\)");
Matcher matcher = patter1.matcher(str);
String result = null;
if (matcher.find()) {
    result = matcher.group(1);
}
System.out.println(result);

2 个答案:

答案 0 :(得分:3)

一种方法是匹配括号中所有可能的模式:

String str = "Text SETVAR((&&text1 '&&text2'))";
Pattern patter1 = Pattern.compile("SETVAR[(]{2}&&\\w+\\s*'&&(\\w+)'[)]{2}");
Matcher matcher = patter1.matcher(str);
String result = "";
if (matcher.find()) {
    result = matcher.group(1);
}
System.out.println(result);

请参阅IDEONE demo

你也可以在括号内使用[^()]*来获得单撇号内的值:

Pattern patter1 = Pattern.compile("SETVAR[(]{2}[^()]*'&&(\\w+)'[)]{2}");
                                               ^^^^^^

请参阅another demo

让我为你打破正则表达式:

  • SETVAR - 字面匹配SETVAR,然后......
  • [(]{2} - 按字面意思匹配2 (,然后......
  • [^()]* - 匹配()以外的0个或多个字符,直至...
  • '&& - 匹配单个撇号和两个&符号,然后......
  • (\\w+) - 匹配并捕获第1组中的一个或多个单词字符
  • '[)]{2} - 匹配单个撇号,然后匹配2个)符号。

答案 1 :(得分:2)

你的正则表达式与你的字符串不匹配,因为你没有指定打开的括号,\\w+将匹配单词字符的任何组合,它与空格和&不匹配。

相反,您可以使用否定字符类[^']+,它将匹配长度为1或更多的字符组合,但一个引号除外:

String str = "Text SETVAR((&&text1 '&&text2'))";

"SETVAR\\(\\([^']+'&&(\\w+)'\\)\\)"

Regular expression visualization

Debuggex Demo