我在属性文件中有以下条目:
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)*)\\]+";
答案 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));
}
[
和]
需要转义,因为它们代表字符类的开头和结尾group(0)
始终是完全匹配,因此您的论坛应以1 [\\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);