我将Snowflake用作数据库,并尝试根据正则表达式子字符串匹配字符串。
具体地说,我在做:
REGEXP_SUBSTR('(hey)', '(?)')
我期望True
来自此,但我得到:
Invalid regular expression: '(?)', no argument for repetition operator: ?
我浏览了文档,但没有发现关于?
在Snowflake正则表达式中的用法有所不同。
知道为什么它忽略左括号吗?
谢谢!
答案 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+\\)');