雪花:使用“?”的正则表达式

时间:2018-08-15 20:37:06

标签: regex snowflake-datawarehouse

我将Snowflake用作数据库,并尝试根据正则表达式子字符串匹配字符串。

具体地说,我在做:

REGEXP_SUBSTR('(hey)', '(?)')

我期望True来自此,但我得到:

Invalid regular expression: '(?)', no argument for repetition operator: ?

我浏览了文档,但没有发现关于?在Snowflake正则表达式中的用法有所不同。

知道为什么它忽略左括号吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

正则表达式具有通用的分组构造
它们封装了子表达式,等效于 scope

一般情况下,它由一对开括号和闭括号( )组成,
在称为元字符的代码列表中,这只是2个正则表达式控制代码。

一开始,这是对构造进行分组的唯一方法,而且也是
作为捕获机制的两倍。

随之而来的是将分组扩展到其他用途的需求。

因此,他们开始在右括号 (<here>
之后添加更多字符 以获得不同的含义。

它已经演变成其他分组构造含义:
(这只是一个示例)

(?: )群集组,未捕获。
(?! )断言,朝前看。
(?<! )断言,后视否定。
(?= )断言,积极向前看。
(?<= )断言,积极乐观。
(?M)内联修饰符(其中M = s,m,i)。
(?'abc' )命名捕获组。
(?<abc> )命名捕获组(替代)。
(?P<abc> )命名捕获组(替代-Python)。
(*abc)回溯控制动词。
(?(abc) |)是有条件的,其中 abc 可以是很多不同的东西。

(?(DEFINE) )特殊条件 DEFINE ,始终为真
而且它的内容永远不会在主线代码中执行。
这是放置函数定义的地方。

(?# )内联代码注释。
(?> )原子组。
(?1)函数调用组号。
(?&abc)对命名组的函数调用。
(?{ })代码构造(Perl)。

您还可以注意到,问号?在所有括号中都紧跟括号
但是回溯控制动词。

在这种情况下,问号不是元字符,而是序列的开始标记
标识什么是分组构造的字符。

没有前导的 end 序列(带有问号),引擎
解析器没有分组构造的真实身份,
因此它回退到最后一个有效的分组结构,即通用捕获组
( )

开始解析该组的内容。

(?)在您的情况下,第一个构造是?
这是修饰对象的修饰符元字符。
由于编译器将分组构造视为已结算的业务,因此
它会抛出错误,该量词没有对任何内容进行量化

     (                             # (1 start)
=         ?  <-- Quantifies nothing
     )                             # (1 end)

答案 1 :(得分:0)

根据文档REGEXP_SUBSTR用于获取匹配的子字符串,因此您将永远不会获得TRUE,但可能会得到非NULL的答案。

SELECT REGEXP_SUBSTR('(hey)', '\\(\\w+\\)');

给出(hey)作为答案

SELECT REGEXP_SUBSTR('(hey)', '\\(\\w+\\)') IS NOT NULL;

因此给您TRUE,但使用起来更简单

SELECT REGEXP_LIKE('(hey)', '\\(\\w+\\)');