我想使用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
-单词边界)
-超前构造的结尾。