Snowflake中的正则表达式 - 以字符串开头且以数字结尾

3
我在Snowflake中编写正则表达式时遇到了困难。
SELECT
 'DEM7BZB01-123' AS SKU,
 RLIKE('DEM7BZB01-123','^DEM.*\d\d$') AS regex

我想找到所有以“DEM”开头、以两个数字结尾的字符串。不幸的是,我使用的表达式返回FALSE。

enter image description here

我在两个正则表达式生成器中检查了这个表达式,它可以工作。
3个回答

5

在Snowflake中,反斜杠字符\是一个转义字符。


参考:转义字符和注意事项

因此,在正则表达式中需要使用两个反斜杠来表示一个。

SELECT
 'DEM7BZB01-123' AS SKU,
 RLIKE('DEM7BZB01-123', '^DEM.*\\d\\d$') AS regex

或者,您可以以不使用反斜杠的方式编写正则表达式模式。

例如,模式^DEM.*[0-9]{2}$与模式^DEM.*\d\d$相匹配。


1

在SQL中,您需要转义反斜杠,以便它可以被解析为正则表达式字符串。(有时需要使用大量的反斜杠,看起来有点傻)

您的示例应如下所示:

RLIKE('DEM7BZB01-123','^DEM.*\\d\\d$') AS regex

1
为了进一步补充David的观点,'^DEM.*\d\d$'在现实世界中是一个有效的正则表达式,但要想通过SQL解析器获取这些斜杠,您需要对它们进行转义,因此它们变成了双重的\\。现在,如果您在STORE PROCEDURE或FUNCTION中编写此SQL语句,则在输入函数时会解析该SQL,而在运行时会再次解析一次,因此普通的单斜杠需要变成4个\\\\。这是从bash脚本到SQL的所有解析脚本中发生的事情。 - Simeon Pilgrim

0

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 |

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接