Regex - найти максимально возможное совпадение, которое было бы найдено без предварительной проверки слов или без

Я не знаю точной терминологии и поэтому, к сожалению, не смог найти решение для своего конкретного случая.

Я знаю, как найти одно слово, за которым не следует другое предопределенное слово, используя отрицательный поиск вперед. Пример

Моя цель состоит в том, чтобы сопоставить только самую большую возможную фразу, которая будет сопоставляться без дополнительной проверки предшествующего слова. Если они следуют за запятой, мне не нужны совпадения в этой группе. Если нет запятой впереди, я хочу, чтобы все они были в одной фразе.

Моя основная идея заключалась бы в том, чтобы сделать обычное регулярное выражение и снова проверить, есть ли запятая перед совпадением. Но можно ли это сделать за один проход?

Пример (глупый): Дом 566 819 , 94841 681 , хороший 4571 68484 81981

Идеальный выход:

  • 566 819

  • 4571 68484 81981

Я хочу, чтобы все числа, которые не следуют непосредственно за запятой (желаемые совпадения выделены жирным шрифтом), совпадали как одно большое совпадение.

Мое текущее регулярное выражение для этого случая выглядит так:

\b(?!,)\s((\d+\s*)+)

Однако он также находит 681, потому что это число и перед ним нет запятой. Это нежелательное для меня поведение.

Надеюсь, я достаточно хорошо объяснил свою проблему. Есть ли способ достичь моей цели?


person LaleMuc    schedule 08.08.2016    source источник
comment
Какой язык вы используете? Обратите внимание, что (?!,)\s является избыточным, поскольку пробел не является запятой.   -  person Casimir et Hippolyte    schedule 08.08.2016
comment
Ваш шаблон не работает, как описано. 94841 не соответствует из-за \b, а не из-за просмотра назад.   -  person Sebastian Proske    schedule 08.08.2016


Ответы (1)


Регулярное выражение

(?<=[^,\d]\s|^)(\d+(?:\d+\s*)+)

Будет соответствовать самой длинной комбинации чисел и пробелов, перед которой непосредственно стоит ^ (начало строки) или что угодно, кроме [,\d]\s (запятая или цифра, за которой следует пробел).

Это то, что вы ищете? Мне было трудно понять ваш вопрос, поэтому я исходил из:

Я хочу, чтобы совпадали все числа, которые не следуют непосредственно за запятой

person Skogsv    schedule 08.08.2016
comment
Работает отлично! Большое спасибо. Я думаю, хитрость здесь заключалась в том, чтобы не допускать никаких цифр впереди ([^,\d]), верно? - person LaleMuc; 08.08.2016
comment
да, мы хотим, чтобы регулярное выражение всегда группировало все числа, а это означает, что перед ним никогда не должно быть чисел. Также обратите внимание, что в моем регулярном выражении нет границы слова, так как это добавляет слишком много ограничений. - person Skogsv; 08.08.2016