我必须解析具有键值对的属性文件,并且可以对某些行进行注释(!或#,两者都有效)。
了Exa:
key1 val1
Key2 val2
#key3 val3
# key4 val4
# It does not have = symbol
# Spaces can be any where.
...
如果未注释行,则将键和值作为匹配器的组值读取。我使用了以下RegEx和代码片段,但它没有按预期捕获键和值:
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("");
}
这是输出:
Input: key1 val1
1 k
2 ey1
3 val1
Input: Key2 val2
1 K
2 ey2
3 val2
Input: #key3 val3
No match found.
Input: # key4 val4
No match found.
我的想法是:
^ - 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
请帮我理解这里有什么问题。 为什么它作为一个组捕获键的第一个字符?
答案 0 :(得分:0)
您无需检查否#或!您可以执行以下操作:/^(?<key>\w+)\s*(?<value>.*)/gm
Javafied正则表达式:^(?<key>\\w+)\\s*(?<value>.*)
(使用多行选项)
答案 1 :(得分:0)
我不会给你解决方案,但我会给你答案:
(\\s*[^#!]\\s*)
&lt; - 这就是捕获第一个字符的原因。你有两个选择:
使用非捕获组(?:Hi, im a non capturing group)
(请参阅(?: )
)
Ps:使用非捕获组会增加正则表达式的内部指针,所以它并不是你想要的。所以最好使用第二个选项。
#!
作为第三种解决方案,使用Java属性文件With this pretty example.
答案 2 :(得分:0)
Input: key1 val1
1 k
2 ey1
3 val1
这是正确的,基于你的正则表达式。
(\\s*[^#!]\\s*) this is the group1.
这意味着,匹配单个字符,而不是#,而不是!在角色之前和之后可能有空格。所以对于你的prop文件中的第一行。 “k”是角色。
你可能想要检查背后的负面看法。它是零宽度断言。
例如:(第2组将是关键)
^\s*(?!<#|!)\s*(\w*).....
希望它有所帮助...