0

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

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

我正在尝试使用正则表达式对其进行解析,但我似乎无法正确分组。我正在尝试为每个条目打印一个键/值。示例:Key="834", Value="Yet another 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

4 回答 4

2

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

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

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

于 2012-05-17T13:20:28.410 回答
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. 注意我是如何写第二组的[\\w\\s]+。这意味着单词或空白字符的字符类
于 2012-05-17T13:31:13.683 回答
1

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

尝试

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

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

我不禁觉得如果没有正则表达式,这可能会更简单,也许是通过拆分\n[然后拆分:其中的每一个。

于 2012-05-17T13:20:31.653 回答
0

由于您使用的是由多行组成的字符串,因此您应该告诉它Pattern

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

尽管它与您直接无关,但我建议您也添加DOTALL

final Pattern p = Pattern.compile(REGEX_PATTERN, Pattern.MULTILINE | Pattern.DOTALL);
于 2012-05-17T13:20:03.603 回答