我想使用Regex Java API识别字符串的所有“单词-数字-单词”序列。

例如,如果我有“ ABC-122-JDHFHG-456-MKJD”,则需要输出:[ABC-122-JDHFHG,JDHFHG-456-MKJD]。

String test = "ABC-122-JDHFHG-456-MKJD";

Matcher m = Pattern.compile("(([A-Z]+)-([0-9]+)-([A-Z]+))+")
            .matcher(test);
while (m.find()) {
    System.out.println(m.group());
}


上面的代码仅返回“ ABC-122-JDHFHG”。

有任何想法吗 ?

最佳答案

最后一个([A-Z]+)匹配并使用JDHFHG,因此正则表达式引擎仅在第一个匹配之后“看到” -456-MKJD,并且模式与此剩余字符串不匹配。

您想获得“整个单词”重叠匹配。

使用

String test = "ABC-122-JDHFHG-456-MKJD";

Matcher m = Pattern.compile("(?=\\b([A-Z]+-[0-9]+-[A-Z]+)\\b)")
            .matcher(test);
while (m.find()) {
    System.out.println(m.group(1));
} // => [ ABC-122-JDHFHG, JDHFHG-456-MKJD ]


请参见Java demo

图案细节


(?=-与前面紧跟的位置相匹配的正向超前开始


\\b-单词边界
(-捕获组的开始(以便获取所需的值)
[A-Z]+-1+ ASCII大写字母
--连字符
[0-9]+-1个以上的数字
--连字符
[A-Z]+-1+ ASCII大写字母

)-捕获组的结尾
\\b-单词边界
)-超前构造的结尾。

09-15 18:52