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
,可选的 .
和
$
- 字符串结尾
如果字符串前面有特定字符,我需要将其排除在匹配之外,我的正则表达式引擎是 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
,可选的.
和$
- 字符串结尾