0

我必须解析具有键值对的属性文件,并且某些行可能会被注释(!或 # ,两者都是有效的)。

例:

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

请帮助我了解这里出了什么问题。为什么它将键的第一个字符作为一个组捕获?

4

3 回答 3

0

您不必检查是否有 # 或 !。你可以简单地做:/^(?<key>\w+)\s*(?<value>.*)/gm

Javafied 正则表达式:(^(?<key>\\w+)\\s*(?<value>.*)使用多行选项)

演示+说明:http ://regex101.com/r/aM0xK1

于 2012-12-24T14:43:16.087 回答
0

我不会给你解决方案,但我会给你问题的答案:

(\\s*[^#!]\\s*)<- 这就是为什么要捕获第一个字符。你有两个选择:

  1. 使用非捕获组(?:Hi, im a non capturing group)(参见(?: )

    Ps:使用非捕获组会增加正则表达式的内部指针,所以这不是你想要的。所以最好使用第二个选项。

  2. 使用lookbehind并观察X之前的字符是否是#!

作为第三种解决方案,使用 Java 属性文件和这个漂亮的例子。

于 2012-12-24T14:49:49.320 回答
0
Input: key1 val1
1 k
2 ey1
3 val1

根据您的正则表达式,这是正确的。

(\\s*[^#!]\\s*) this is the group1. 

这意味着,匹配单个字符,而不是#,而不是!。字符前后可能有空格。所以对于你的道具文件的第一行。“k”是字符。

您可能要检查负面的外观。它是零宽度断言。

例如像这样:(第 2 组将是关键)

^\s*(?!<#|!)\s*(\w*).....

希望能帮助到你...

于 2012-12-24T14:51:26.280 回答