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]
Как это можно достичь?
Ответы
Ответ 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 ")).
в конце.