Posix 正则表达式的负后视解决方法

Negative Lookbehind Workaround For Posix Regex

如果字符串前面有特定字符,我需要将其排除在匹配之外,我的正则表达式引擎是 POSIX。我能够在 https://regexr.com/ 上使用负面回顾获得所需的结果,但我发现它在我的 POSIX SnowFlake 平台上不起作用:-( .

我正在尝试标准化公司名称的变体,并希望匹配以 'COMPANY'、'CO' 或 'CO.' 结尾的字符串,但不匹配前面有一个 ' & '。所以 'COMPANY' 会在 'POWERWASH COMPANY' 中匹配,但不会在 'JONES & COMPANY'.

中匹配

有什么方法可以在 POSIX 正则表达式中完成此操作?我能够使用负面的后视来让它工作,如下所示:

(?<!&)( COMPANY$| CO[.]?$)

您可以使用捕获组(正如您已经在做的那样)并将不相关的部分放在组的外面

[^&]( COMPANY| CO\.?)$

Demo.

我对 SnowFlake 不太熟悉,但根据 the documentation,您可以使用 regexp_substr 方法提取第 1 组捕获的值,如下所示:

regexp_substr(input, '[^&]( COMPANY| CO\.?)$', 1, 1, 'e', 1)
--                                                        ^
--                                              Group number

请注意,[^&] 将匹配“&”以外的任何字符。如果您希望匹配成功,即使目标词位于字符串的开头,您可以使用 (^|[^&]) 代替 [^&]。在这种情况下,您可以从组 2 而不是组 1 中提取值。

您可以使用

(^|[^&])( COMPANY| CO[.]?)$

参见regex demo

无论您捕获什么,在 POSIX 正则表达式中通常都不重要,但在其他情况下,使用额外的捕获组和代码逻辑通常很容易解决。

正则表达式详细信息:

  • (^|[^&]) - 字符串的开头或 &
  • 以外的任何字符
  • ( COMPANY| CO[.]?) - space 和 COMPANY,或 space、CO,可选的 .
  • $ - 字符串结尾