Нежадные группы захвата в Postgres - PullRequest
2 голосов
/ 17 февраля 2020

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

  • language_change__from_english_to_spanish
  • language_change__from_spanish_to_somali
  • language_change__from_simplified_chinese_to_english

У меня есть регулярное выражение для анализа языков (исходный язык, а затем новый язык):

SUBSTRING(language_field FROM '^language_change__([a-zA-Z_]+)_to_[a-zA-Z_]+$')

Работает отлично для оригинального языка, но не так хорошо для нового языка, потому что иногда люди вводят в language_change__from_english_to_spanish_. Таким образом, на самом деле анализируется spanish_ вместо spanish.

Я знаю, что я мог бы просто обернуть SUBSTRING(...) REPLACE, чтобы заменить окончательный _, но я пытаясь найти способ сделать это с помощью регулярных выражений, чтобы отточить свои навыки регулярных выражений. Я в основном хочу игнорировать финал _. Однако я не могу удалить _ из моей группы захвата, потому что некоторые языки, закодированные в нашей системе, имеют, например, _: simplified_chinese.

По сути, я хочу, чтобы моя группа захвата включала первый _, за которым следует текст (например, simplified_chinese), но не включайте _, если он находится в конце строки (english_).

Поэтому, когда language_change__from_spanish_to_english_ Введенный, я все еще должен захватить english, а не english_ в качестве языка.

Я пробовал различные способы:

  • Использование отрицательный взгляд : SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+)(?!_)$')
  • Использование не жадных групп захвата : SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+?)$')
  • Использование комбинации отрицательных прогнозных и не жадных групп захвата : SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+?)(?!_)$')

Мне кажется, что я достаточно долго работал в StackOverflow, чтобы не сказать "ничего не работает", но все три вещи, которые я пробовал выше, все равно дают english_, а не english когда люди неправильно ввели language_change__from_spanish_to_english_ с нашей стороны.

Может кто-нибудь подсказать, что мне не хватает?

1 Ответ

3 голосов
/ 17 февраля 2020

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

SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+?)_*$')

Часть ([a-zA-Z_]+?)_*$ означает:

  • ([a-zA-Z_]+?) - Группа 1: соответствует 1 или нескольким буквам ASCII или _ как можно меньше максимально возможное число раз
  • _* - соответствует 0 или более _ символы
  • $ - в конце строки.

([a-zA-Z_]+?) шаблон будет соответствовать 1 символу, затем будет пробоваться часть шаблона _*$. Если _*$ не совпадает, двигатель вернется назад, а шаблон ([a-zA-Z_]+?) захватит другой символ и тесты будут повторены. Следовательно, если в конце строки существует _ s, они не будут включены в группу захвата, они будут сопоставлены с частью _* и, таким образом, будут исключены из результата.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...