Подтвердить что ты не робот

Java regex - совпадающие совпадения

В следующем коде:

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]

Как это можно достичь?

4b9b3361

Ответ 1

Сделайте попытку сопряжения, чтобы начать свое следующее сканирование с последнего \d+.

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

Ответ 2

Не уверен, что это возможно на Java, но в PCRE вы можете сделать следующее:
(?=(\d+\D+\d+)).

Объяснение
Метод состоит в том, чтобы использовать соответствующую группу в представлении, а затем "съесть" один символ, чтобы двигаться вперед.

  • (?=: начало позитивного обзора
    • (: начать сопоставление группы 1
      • \d+: сопоставить цифру один или несколько раз
      • \d+: односимвольное совпадение с символом без цифры
      • \d+: сопоставить цифру один или несколько раз
    • ): конец группы 1
  • ): конец просмотра
  • .: соответствовать чему угодно, это значит "двигаться вперед".

Демо-версия


Благодаря Casimir et Hippolyte он действительно работает на Java. Вам просто нужно добавить обратную косую черту и отобразить первую группу захвата: (?=(\\d+\\D+\\d+)).. Протестировано на www.regexplanet.com:

enter image description here

Ответ 3

Вышеупомянутое решение HamZa отлично работает на Java. Если вы хотите найти конкретный шаблон в тексте, все, что вам нужно сделать, это:

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

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

Если regex - это шаблон, который вы ищете и который должен быть перекрыт, вам нужно окружить его (?=(" at the start and ")). в конце.