Узор во взгляде

Мой вопрос связан с 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[^\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

Сейчас я пытаюсь использовать lookbehinds, так как я не хочу включать часть результатов в результаты. После моего первого подхода:

Шаблон:

(?<=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

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

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

3 ответа

Решение

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

То, что вы можете сделать, может быть с помощью lookahead и группы захвата:

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

regex101 demo

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

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

regex101 demo

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

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

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

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

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

Но они будут хорошо работать с этим:

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

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

Другие вопросы по тегам