22

在以下代码中:

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]

如何实现?

4

3 回答 3

17

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

Matcher m = Pattern.compile("\\d+\\D+(\\d+)").matcher("2abc3abc4abc5");
if (m.find()) {
    do {
        allMatches.add(m.group());
    } while (m.find(m.start(1)));
}
于 2013-07-31T13:26:10.057 回答
15

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

解释
该技术是在前瞻中使用匹配组,然后“吃掉”一个字符向前移动。

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

在线演示


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

在此处输入图像描述

于 2013-07-31T13:24:46.940 回答
5

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

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

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

您正在寻找的图案在哪里regex,并且要重叠,您需要(?=(" at the start and ")).在最后将其包围。

于 2017-10-01T23:25:41.287 回答