Java正则表达式分组

时间:2012-05-17 13:16:22

标签: java regex

我在属性文件中有以下条目:

some.key = \n
  [1:Some value] \n
  [14:Some other value] \n
  [834:Yet another value] \n

我正在尝试使用正则表达式解析它,但我似乎无法使分组正确。我正在尝试打印每个条目的键/值。示例:Key =" 834",Value ="还有另一个值"

private static final String REGEX_PATTERN = "[(\\d+)\\:(\\w+(\\s)*)]+";

private void foo(String propValue){
    final Pattern p = Pattern.compile(REGEX_PATTERN);
    final Matcher m = p.matcher(propValue);
    while (m.find()) {
        final String key = m.group(0).trim();
        final String value = m.group(1).trim();
        System.out.println(String.format("Key[%s] Value[%s]", key, value));            
    }
}

我得到的错误是:

Exception: java.lang.IndexOutOfBoundsException: No group 1

我以为我在正则表达式中正确分组,但我猜不是。任何帮助将不胜感激!

由于

更新: 逃避括号工作。将模式更改为以下谢谢以获得反馈!

 private static final String REGEX_PATTERN = "\\[(\\d+)\\:(\\w+(\\w|\\s)*)\\]+";

4 个答案:

答案 0 :(得分:2)

[应该被转义(以及])。

"\\[(\\d+)....\\]+"

[]用于字符类:[0-9] == (0|1|2|...|9)

答案 1 :(得分:2)

试试这个:

private static final String REGEX_PATTERN = "\\[(\\d+):([\\w\\s]+)\\]";

final Pattern p = Pattern.compile(REGEX_PATTERN);
final Matcher m = p.matcher(propValue);
while (m.find()) {
    final String key = m.group(1).trim();
    final String value = m.group(2).trim();
    System.out.println(String.format("Key[%s] Value[%s]", key, value));
}
  1. []需要转义,因为它们代表字符类的开头和结尾
  2. group(0)始终是完全匹配,因此您的论坛应以1
  3. 开头
  4. 请注意我是如何编写第二组[\\w\\s]+的。这意味着字或空白字符的字符类

答案 2 :(得分:1)

这是你的正则表达式,[]是特殊字符,如果你想按字面解释它们,需要进行转义。

尝试

"\\[(\\d+)\\:(\\w+(\\s)*)\\]"

注意 - 我删除了'+'。匹配器将继续查找与模式匹配的子字符串,因此不需要+。 (您可能需要输入GLOBAL开关 - 我不记得了。)

我不禁觉得这可能比没有正则表达式更简单,可能是分开\n[然后分开:为每一个。

答案 3 :(得分:0)

由于您使用的是包含多行的字符串,因此您应该将其告诉Pattern

final Pattern p = Pattern.compile(REGEX_PATTERN, Pattern.MULTILINE);

虽然它直接与您无关,但我建议您添加DOTALL

final Pattern p = Pattern.compile(REGEX_PATTERN, Pattern.MULTILINE | Pattern.DOTALL);