1

请帮我进行模式匹配。我想构建一个模式,它将匹配字符串中以j-c-以下开头的单词(例如)

[j-test] is a [c-test]'s name with [foo] and [bar]

该模式需要找到[j-test][c-test](包括括号)。

到目前为止我尝试了什么?

String template = "[j-test] is a [c-test]'s name with [foo] and [bar]";
Pattern patt = Pattern.compile("\\[[*[j|c]\\-\\w\\-\\+\\d]+\\]");
Matcher m = patt.matcher(template);
while (m.find()) {
    System.out.println(m.group());
}

它的输出就像

[j-test]
[c-test]
[foo]
[bar]

这是错误的。请帮助我,感谢您在此线程上的时间。

4

1 回答 1

5

在字符类中,您不需要使用交替来匹配jc. 字符类本身意味着,匹配其中的任何单个字符。因此,[jc]它本身将匹配jc

此外,您不需要匹配j-or之后的模式c-,因为您不关心它们,只要它们以j-or开头c-

只需使用此模式:

Pattern patt = Pattern.compile("\\[[jc]-[^\\]]*\\]");

解释:

Pattern patt = Pattern.compile("(?x)      "   // Embedded flag for Pattern.COMMENT
                             + "\\[       "   // Match starting `[`
                             + "    [jc]  "     // Match j or c
                             + "    -     "     // then a hyphen
                             + "    [^    "     // A negated character class
                             + "       \\]"        // Match any character except ] 
                             + "    ]*    "     // 0 or more times
                             + "\\]       "); // till the closing ]

在正则表达式中使用(?x)标志,忽略空格。编写可读的正则表达式通常很有帮助。

于 2013-10-14T09:28:04.063 回答