REGEX смотреть за ошибкой утверждения в Netezza SQL

Добрый день

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

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 ответ

Решение

Вы можете переписать шаблон так, чтобы альтернативные варианты выглядели одинаково. Как (?<!(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) - отрицательный взгляд сзади с двухбуквенными словами
  • (?<!U\s) - отрицательный взгляд сзади с 1 буквенными словами
  • SAVE - буквальная подстрока
  • \s? - необязательный пробел
  • (SUPERMARKET|HYPER) - любое из двух значений
  • \b - граница слова.

Посмотреть демо-версию регулярного выражения

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