匹配所有出现的Regex Java

时间:2018-01-17 22:28:50

标签: java regex

我想识别" 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;。

有什么想法吗?

2 个答案:

答案 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