繁体   English   中英

Java正则表达式 - 重叠匹配

[英]Java regex - overlapping matches

在以下代码中:

public static void main(String[] args) {
    List<String> allMatches = new ArrayList<String>();
    Matcher m = Pattern.compile("\\d+\\D+\\d+").matcher("2abc3abc4abc5");
    while (m.find()) {
        allMatches.add(m.group());
    }

    String[] res = allMatches.toArray(new String[0]);
    System.out.println(Arrays.toString(res));
}

结果是:

[2abc3, 4abc5]

我希望它是

[2abc3, 3abc4, 4abc5]

如何实现?

使匹配器尝试从后一个\\d+开始其下一次扫描。

Matcher m = Pattern.compile("\\d+\\D+(\\d+)").matcher("2abc3abc4abc5");
if (m.find()) {
    do {
        allMatches.add(m.group());
    } while (m.find(m.start(1)));
}

不确定这在 Java 中是否可行,但在 PCRE 中您可以执行以下操作:
(?=(\\d+\\D+\\d+)).

解释
该技术是在前瞻中使用匹配组,然后“吃掉”一个字符以继续前进。

  • (?= : 正向前瞻的开始
    • ( : 开始匹配组 1
      • \\d+ :匹配一个数字一次或多次
      • \\D+ :匹配一个非数字字符一次或多次
      • \\d+ :匹配一个数字一次或多次
    • ) : 第 1 组结束
  • ) : 前瞻结束
  • . : 匹配任何东西,这是为了“前进”。

在线演示


感谢Casimir et Hippolyte,它似乎真的可以在 Java 中工作。 您只需要添加反斜杠并显示第一个捕获组: (?=(\\\\d+\\\\D+\\\\d+)). . www.regexplanet.com 上测试:

在此处输入图片说明

HamZa的上述解决方案在Java中完美运行。 如果你想在文本中找到特定的模式,你所要做的就是:

String regex = "\d+\D+\d+";

String updatedRegex = "(?=(" + regex + ")).";

regex是您正在寻找的模式并且要重叠,您需要用(?=(" at the start and ")).将其包围(?=(" at the start and ")). 在末尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM