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
- граница слова.
Посмотреть демо-версию регулярного выражения