Шаблон в lookbehind

Мой вопрос связан с lookbehinds, я хочу найти все первые числа после слова "this", у меня есть следующие данные:

188282 это пример числа 12345 и 54321
188282 это пример номера 1234556
это пример номера 1234556
187293 это еще один пример номера 74893 и 83978

шаблон:

this is an example of a number \d+

Выход:

188282 this is an example of a number 12345 и 54321
188282 this is an example of a number 1234556
this is an example of a number 1234556
187293 это еще один пример номера 74893 и 83978

Чтобы соответствовать всем им, я использовал более общий подход, поскольку я знаю, что я хочу, чтобы первое число после слова "this"

Шаблон:

this[^\d]+\d+

Выход:

188282 this is an example of a number 12345 и 54321
188282 this is an example of a number 1234556
this is an example of a number 1234556
187293 this is another example of a number 74893 и 83978

Im tring использовать lookbehind сейчас, так как я не хочу включать часть шаблона в результаты. Следуя моему первому подходу:

Шаблон:

(?<=this is an example of a number )\d+

Выход:

188282 это пример числа 12345 и 54321
188282 это пример числа 1234556
это пример числа 1234556
187293 это еще один пример номера 74893 и 83978

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

Шаблон:

(?<=this[^\d]+)\d+

Выход:

188282 это пример числа 12345 и 54321
188282 это пример номера 1234556
это пример номера 1234556
187293 это еще один пример номера 74893 и 83978

Не соответствует чему-либо Возможно ли иметь шаблоны внутри lookbehinds? Я пытаюсь ошибиться в этой проблеме? Его немного длиннее, но я хотел показать вам, что я пробовал, а не просто задавать вопрос

Заранее спасибо

Ответ 1

Вещь с lookbehinds заключается в том, что не все языки поддерживают переменную ширину lookbehinds (они не могут поддерживать lookbehinds, где внутри может быть переменное количество символов).

Что вы можете сделать, возможно, использовать lookahead и группу захвата:

(?=this[^\d]+(\d+))

демонстрация regex101

Или, может быть, символ регулярного выражения \K, который сбрасывает совпадение (если ваш механизм regex поддерживает его).

this[^\d]+\K\d+

демо-версия regex101

Ответ 2

Да, вы можете использовать шаблоны внутри lookbehinds, но вы не можете делать в большинстве ароматов регулярного выражения, чтобы иметь переменную длину lookbehind. Другими словами, вы не можете использовать квантификатор (но допускается фиксированный квантификатор, такой как {n}) внутри lookbehind. Но некоторый аромат регулярного выражения позволяет использовать чередование | или ограниченный (как в java) квантификатор {1,n}.

С языками переменной .net допускается длина переменной длины.

Ответ 3

Это зависит от вашей реализации регулярного выражения. Вам нужно будет провести некоторое тестирование.

Я знаю, что некоторым реализациям это не нравится:

(?<=\d{1,5}) или (?<=\w*)

Но они отлично справятся с этим:

(?<=\d{5}) или (?<=\w{1000})

Другими словами, нет повторений или гибких длин.