正则表达式不匹配正确的字符串

Regex not matching correct string

我正忙于为商家的特定名称构建一个查找 table。我尝试使用以下正则表达式,但它返回的结果少于 Netezza SQL 中的标准 "like" 函数。请参考以下:

SQL Like function: where trim(upper(a.MRCH_NME)) like '%CNA %' -- returns 4622 场比赛

Netezza 中的正则表达式函数 SQL:其中 array_combine(regexp_extract_all(trim(upper(a.MRCH_NME)),'.*CNA\s','i'),'|') = 'CNA' -- returns 2226 场比赛

我查看了两个结果集,发现不匹配如下字符串:

!C CNA INT ARR
*CNA PLATZ 0400
015764 CNA CRAD
C#CNA PARK 0

我使用了以下正则表达式:/.*[=​​34=]'/

知道为什么上面的字符串没有作为匹配返回吗?

谢谢。

您可能应该使用 regexp_like:

SELECT *
FROM yourTable
WHERE REGEXP_LIKE(MRCH_NME, 'CNA[ ]', 'i');

这在逻辑上与以下使用 LIKE 的查询相同:

SELECT *
FROM yourTable
WHERE MRCH_NME LIKE '%CNA ';

在我看来,问题更多出在您的代码上,而不是正则表达式上。查看:like '%CNA %' returns 包含 的所有条目 CNA 子字符串后跟条目内任意位置的文字 space。 '.*CNA\s' 正则表达式匹配除换行符之外的任何 0+ 个字符,后跟 CNA 和 **any whitespace char*.

累积this reference, \s 匹配 " 白色 space 字符。白色 space 定义为 [\t\n\f\r\p{Z}].

因此,您实际上应该只使用

WHERE REGEXP_LIKE(MRCH_NME, 'CNA ', 'i')

或者,最好进行单词边界检查:

WHERE REGEXP_LIKE(MRCH_NME, '\bCNA\b', 'i')

其中 \b 标记了从单词到非单词以及从非单词到单词字符的转换,从而确保了整个单词搜索并证明了正则表达式的使用。

如果不需要整词匹配商户名,使用正则LIKE'%CNA %',效率会更高。