如何为逗号分隔符列表创建一个java正则表达式

时间:2010-07-19 17:17:24

标签: java

如何为逗号分隔符列表创建java正则表达式

(3) (3,6) (3,6)

我试过,但它与任何东西都不匹配:

Pattern.compile("\\(\\S[,]+\\)")

如何在Matcher类的代码中获取值“3”或“3”和“6”?

2 个答案:

答案 0 :(得分:2)

我不清楚你输入的确切内容,但我怀疑你使用的模式是你想要的。您的模式将匹配文字(,后跟一个非空白字符,后跟一个或多个逗号,后跟文字)

如果你想匹配一个数字,可选地后面跟一个逗号和另一个数字,所有数字都被括号括起来,你可以试试这个模式:

"\\(\\s*(\\d+)\\s*(,\\d+)?\\s*\\)"

应与(3)( 3 )( 3, 6)等匹配,但不是 (a)(3, a)

您可以使用Matcher.group检索匹配的数字;第一个数字将是组1,第二个数字(如果有)将是组2

答案 1 :(得分:1)

验证正则表达式

为了清晰起见,您可以尝试这种元正则表达式方法:

    String pattern = 
        "< part (?: , part )* >"
            .replace("<", "\\(")
            .replace(">", "\\)")
            .replace(" ", "\\s*")
            .replace("part", "[^\\s*(,)]++");

    System.out.println(pattern);
    /*** this is the pattern
    \(\s*[^\s*(,)]+\s*(?:\s*,\s*[^\s*(,)]+\s*)*\s*\)
    ****/

part模式是[^\s(,)]+,即除了空格,括号和逗号之外的任何内容中的一个或多个。此构造称为否定字符类[aeiou]匹配5个元音字母中的任何一个; [^aeiou]匹配所有内容(包括辅音,但也包括数字,符号,空格)。

+重复也被++占有优势。 (?:...)构造是非捕获组,也用于优化。

参考


测试和拆分

然后我们可以按如下方式测试模式:

    String[] tests = {
        "(1,3,6)",
        "(x,y!,a+b=c)",
        "( 1,    3  , 6)",
        "(1,3,6,)",
        "(())",
        "(,)",
        "()",
        "(oh, my, god)",
        "(oh,,my,,god)",
        "([],<>)",
        "(  !!  ,  ??  ,  ++  )",
    };

    for (String test : tests) {
        if (test.matches(pattern)) {
            String[] parts = test
                .replaceAll("^\\(\\s*|\\s*\\)$", "")
                .split("\\s*,\\s*");

            System.out.printf("%s = %s%n",
                test,
                java.util.Arrays.toString(parts)
            );
        } else {
            System.out.println(test + " no match");
        }
    }

打印:

(1,3,6) = [1, 3, 6]
(x,y!,a+b=c) = [x, y!, a+b=c]
( 1,    3  , 6) = [1, 3, 6]
(1,3,6,) no match
(()) no match
(,) no match
() no match
(oh, my, god) = [oh, my, god]
(oh,,my,,god) no match
([],<>) = [[], <>]
(  !!  ,  ??  ,  ++  ) = [!!, ??, ++]

在修剪括号后,使用String.split获取所有部分的String[]