Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要读取prop文件的Regex条目未正确捕获组_Java_Regex - Fatal编程技术网

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*).....