REGEX смотреть за ошибкой утверждения в Netezza SQL - PullRequest
0 голосов
/ 06 июня 2018

Добрый день

Я классифицирую торговые строки по их именам, но я борюсь с торговцами, у которых есть имена, которые могут иметь несколько прекурсоров.Я пытался использовать отрицательное утверждение за кадром, но я борюсь со следующим выражением:

regexp_like(trim(upper(MRCH_NME_POST_ACTION)),'\b(?<!(BIG|XTRA|TOWN|SUPER|U|TOP|SHOP|PICK|MAX|POWER|NU|) )SAVE\s?(SUPERMARKET|HYPER)\b','i')

Я получил следующий код ошибки для регулярного выражения, которое я использую в Netezza SQL:

ERROR [HY000] ERROR:  0 : Regex: pos(58) lookbehind assertion is not fixed length
Culprit Pattern: \b(?<!(BIG|XTRA|TOWN|SUPER|U|TOP|SHOP|PICK|MAX|POWER|NU|) )SAVE\s?(SUPERMARKET|HYPER)\b

Какие-нибудь решения проблемы фиксированной длины?

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

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете переписать шаблон так, чтобы альтернативные варианты выглядели одинаково.Поскольку (?<!(a|bc|def) ) равно (?<!a )(?<!bc )(?<!def ), вы можете использовать

\b(?<!(SHOP|XTRA|TOWN|PICK)\s)(?<!(SUPER|POWER)\s)(?<!U\s)(?<!NU\s)(?<!(BIG|TOP|MAX)\s)SAVE\s?(SUPERMARKET|HYPER)\b

Если мы отформатируем его, вы увидите, что

  • \b - соответствует границе слова
  • (?<!(SUPER|POWER)\s) - отрицательный взгляд с 5-буквенными словами
  • (?<!(SHOP|XTRA|TOWN|PICK)\s) - отрицательный взгляд с 4-буквенными словами
  • (?<!(BIG|TOP|MAX)\s) - отрицательный взгляд с 3-буквенными словами
  • (?<!NU\s) - отрицательный вид сзади с 2-буквенными словами
  • (?<!U\s) - отрицательный вид сзади с 1-буквенными словами
  • SAVE - буквенная подстрока
  • \s? - необязательный пробел
  • (SUPERMARKET|HYPER) - любое из двух значений
  • \b - граница слова.

См. regex demo

...