Регулярное совпадение с последним появлением перед - PullRequest
1 голос
/ 24 сентября 2019

Я бы объяснил \d{3}(?=.*(?!\d{3})string), чтобы соответствовать только 333 здесь 000 111 222 333 string 444 555 666 - но это не так.Кто-нибудь знает, почему?


Я также ожидал бы, что в этом случае 000 111 222 333 sdfasdjf;sdfjn 999 skljdfn\;sdlfn\sd string 444 555 666 только 999 получили совпадение ... просто чтобы прояснить.

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

1 Ответ

1 голос
/ 24 сентября 2019

Шаблон \d{3}(?=.*(?!\d{3})string) соответствует любым 3 цифрам, за которыми следуют любые 0+ символов, а затем текст string, который не начинается с 3 цифр - что всегда верно, string не начинаетсяс 3 цифрами.

Вы можете использовать

\d{3}(?!.*\d{3}.*string)(?=.*string)

Или, если 3-значные блоки должны соответствовать целым словам:

\b\d{3}\b(?!.*\b\d{3}\b.*string)(?=.*string)

Или - если эти3 цифры всегда должны быть заключены в пробелы

(?<!\S)\d{3}(?!\S)(?!.*(?<!\S)\d{3}(?!\S).*string)(?=.*string)

См. Демонстрационный пример regex

Здесь, после сопоставления трех цифр,

  • (?!.*\d{3}.*string) - отрицательный прогноз означает, что нет 3 цифр, а затем string в любом месте справа от текущего местоположения
  • (?=.*string) - положительный прогноз, требующий string для появления в любом месте справа оттекущее местоположение.
...