在Snowflake中,反斜杠字符\
是一个转义字符。
因此,在正则表达式中需要使用两个反斜杠来表示一个。
SELECT
'DEM7BZB01-123' AS SKU,
RLIKE('DEM7BZB01-123', '^DEM.*\\d\\d$') AS regex
或者,您可以以不使用反斜杠的方式编写正则表达式模式。
例如,模式^DEM.*[0-9]{2}$
与模式^DEM.*\d\d$
相匹配。
在SQL中,您需要转义反斜杠,以便它可以被解析为正则表达式字符串。(有时需要使用大量的反斜杠,看起来有点傻)
您的示例应如下所示:
RLIKE('DEM7BZB01-123','^DEM.*\\d\\d$') AS regex
RLIKE
(在Snowflake中是SQL标准REGEXP_LIKE
函数的别名)会隐式地将^
和$
添加到您的搜索模式中...
该函数会自动在模式的两端添加锚点(即''自动变成'^$','ABC'自动变成'^ABC$')。
因此,您可以将它们删除,这样就可以使用$$
引用了
在单引号字符串常量中,必须转义反斜杠字符。例如,要指定\d,请使用\d。有关详细信息,请参阅“在单引号字符串常量中指定正则表达式”(本主题中)。
如果您使用一对美元符号($$)(而不是单引号)来分隔字符串,则无需转义反斜杠。
所以你可以简单地使用正则表达式DEM.*\d\d
来查找所有以DEM
开头并以两个数字结尾的字符串,无需额外转义,如下所示
SELECT
'DEM7BZB01-123' AS SKU
, RLIKE('DEM7BZB01-123', $$DEM.*\d\d$$) AS regex
这提供了
SKU |REGEX|
-------------+-----+
DEM7BZB01-123|true |
'^DEM.*\d\d$'
在现实世界中是一个有效的正则表达式,但要想通过SQL解析器获取这些斜杠,您需要对它们进行转义,因此它们变成了双重的\\
。现在,如果您在STORE PROCEDURE或FUNCTION中编写此SQL语句,则在输入函数时会解析该SQL,而在运行时会再次解析一次,因此普通的单斜杠需要变成4个\\\\
。这是从bash脚本到SQL的所有解析脚本中发生的事情。 - Simeon Pilgrim