首页 > 解决方案 > Posix 正则表达式的负向回溯解决方法

问题描述

如果字符串前面有某个字符,我需要从匹配中排除字符串,并且我的正则表达式引擎是 POSIX。我能够在https://regexr.com/上使用否定的lookbehind 获得所需的结果,但只是发现这在我的 POSIX SnowFlake 平台上不起作用:-(。

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

有没有办法在 POSIX 正则表达式中完成这个?我能够使用负面的后视来让它工作,如下所示:

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

标签: regexposixsnowflake-cloud-data-platformregex-lookaroundslookbehind

解决方案


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

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

演示

我对 SnowFlake 不太熟悉,但根据文档,您可以使用以下方法提取组 1 捕获的值regexp_substr

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

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


推荐阅读