我想识别" word-number-word"的所有序列。使用Regex Java API的字符串。
例如,如果我有&#34; ABC-122-JDHFHG-456-MKJD&#34;,我喜欢输出:[ABC-122-JDHFHG,JDHFHG-456-MKJD]。< / p>
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());
}
以上代码仅返回&#34; ABC-122-JDHFHG&#34;。
有什么想法吗?
答案 0 :(得分:3)
最后([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
- 字边界)
- 前瞻构造的结尾。答案 1 :(得分:0)
在这里,重叠最后一个单词 从捕获组1中创建一个数组。
基本上,找3消耗2.这使得 next 匹配位置开始
在下一个可能已知的单词上。
(?=(([A-Z]+-\d+-)[A-Z]+))\2
https://regex101.com/r/Sl5FgT/1
格式化
(?= # Assert to find
( # (1 start), word,num,word
( # (2 start), word,num
[A-Z]+
-
\d+
-
) # (2 end)
[A-Z]+
) # (1 end)
)
\2 # Consume word,num