Шаблон в 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})
Другими словами, нет повторений или гибких длин.