Java 要读取prop文件的Regex条目未正确捕获组
我必须解析具有键值对的属性文件,其中一些行可能会被注释(!或#,两者都有效) 例: 若行并没有注释,那个么读取键和值作为匹配器的组值。我使用了下面的正则表达式和代码片段,但它没有像预期的那样捕获键和值:Java 要读取prop文件的Regex条目未正确捕获组,java,regex,Java,Regex,我必须解析具有键值对的属性文件,其中一些行可能会被注释(!或#,两者都有效) 例: 若行并没有注释,那个么读取键和值作为匹配器的组值。我使用了下面的正则表达式和代码片段,但它没有像预期的那样捕获键和值: String inputs[] = { "key1 val1", "Key2 val2", "#key3 val3", " # key4 val4" };
String inputs[] = {
"key1 val1",
"Key2 val2",
"#key3 val3",
" # key4 val4"
};
Pattern PATTERN = Pattern.compile("^(\\s*[^#!]\\s*)(\\w*)\\s+(\\w*).*$");
for (int i = 0; i < inputs.length; i++) {
System.out.println("Input: " + inputs[i]);
Matcher matcher = PATTERN.matcher(inputs[i]);
if(matcher.matches()) {
int groupCount = matcher.groupCount();
if(groupCount > 0) {
for (int j = 1; j <= groupCount; j++) {
System.out.println(j + " " + matcher.group(j));
}
} else {
System.out.println(matcher.group());
}
} else {
System.out.println("No match found.");
}
System.out.println("");
}
我的想法是:
^ - Start of line
(\\s*[^#!]\\s*) - space(s) followed by NO # or ! followed by space(s)
(\\w*) - Key
\\s+ - spaces(s)
(\\w*) - Value
.* - Anything
$ - End of line
请帮我弄明白这里出了什么问题。
为什么它要将key的第一个字符作为一个组捕获 您不必检查“否”或!。您只需执行以下操作:
/^(?\w+)\s*(?*)/gm
Javafied正则表达式:^(?\\w+\\s*(?*)
(使用多行选项)
演示+解释:我不会给你答案,但我会给你问题的答案:
(\\s*[^#!]\\s*)
根据您的正则表达式,这是正确的
(\\s*[^#!]\\s*) this is the group1.
意思是,匹配单个字符,而不是#,不是!。字符前后可能有空格。所以在你的道具文件的第一行。“k”是字符
您可能需要检查负片“向后看”。它是零宽度断言
例如:(第2组是关键)
^\s*(?!为什么不使用Java属性文件?+1到@JavierDiaz:Java属性文件具有您描述的语法,您不需要解析它,只需将其作为属性文件读取即可。
^ - Start of line
(\\s*[^#!]\\s*) - space(s) followed by NO # or ! followed by space(s)
(\\w*) - Key
\\s+ - spaces(s)
(\\w*) - Value
.* - Anything
$ - End of line
Input: key1 val1
1 k
2 ey1
3 val1
(\\s*[^#!]\\s*) this is the group1.
^\s*(?!<#|!)\s*(\w*).....