Найти все совпадения неоднозначного регулярного выражения [duplicate]

Если принятый ответ не подходит для вас, вы можете попробовать.

str.replace(new RegExp('\n','g'), '<br />')

Это сработало для меня.

17
задан Evgeny 31 July 2013 в 14:15
поделиться

3 ответа

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

Matcher m = Pattern.compile("\\d+\\D+(\\d+)").matcher("2abc3abc4abc5");
if (m.find()) {
    do {
        allMatches.add(m.group());
    } while (m.find(m.start(1)));
}
16
ответ дан johnchen902 22 August 2018 в 20:58
поделиться
  • 1
    Первым двум избирателям: обычная версия содержит ошибку, которая, если ничего не соответствует, будет выброшена IllegalStateException. – johnchen902 31 July 2013 в 14:34
  • 2
    +1 для хорошей импровизации. – anubhava 31 July 2013 в 14:35

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

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

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

Онлайн-демонстрация


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

enter image description here [/g3]

13
ответ дан Community 22 August 2018 в 20:58
поделиться
  • 1
    Он работает и в java. – Casimir et Hippolyte 31 July 2013 в 14:27
  • 2
    Это дает неправильные результаты. – anubhava 31 July 2013 в 14:28
  • 3
    Не работает в java. – JDiPierro 31 July 2013 в 14:29
  • 4
    Не работает. Используйте 12abc13abc14abc15 как вход, а результат - [12abc13, 2abc13, 13abc14, 3abc14, 14abc15, 4abc15] вместо [12abc13, 13abc14, 14abc15]. См. Комментарии к моему и OP в вопросе. – johnchen902 31 July 2013 в 14:44
  • 5
    @ johnchen902: вы должны заменить шаблон на (?=((?<!\\d)\\d+\\D+\\d+)), если вы не хотите, чтобы накладываемые результаты совпадали с вашими совпадающими результатами. :) – Casimir et Hippolyte 31 July 2013 в 14:52

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

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

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

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

2
ответ дан PredatorIWD 22 August 2018 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: