Netezza 中的 REGEX 回顾断言错误 SQL

REGEX lookbehind assertion error in 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

定长问题有什么解决办法吗?

提前致谢

您可以重新编写模式,使后视变换具有相同的长度。由于 (?<!(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