我使用Snowflake作为数据库,并尝试基于正则表达式子字符串匹配字符串。
具体地说,我正在做:
REGEXP_SUBSTR('(hey)', '(?)')
我希望从这里得到True,但是我得到了:
Invalid regular expression: '(?)', no argument for repetition operator: ?我浏览了文档,但没有看到任何关于?在Snowflake正则表达式中的不同使用情况。
你知道为什么它忽略了左括号吗?
谢谢!
发布于 2018-08-16 10:28:39
正则表达式有一个通用的分组结构。
它们封装子表达式,等同于作用域。
在一般形式中,它由一对左括号和闭括号( )组成,
它们只是称为元字符的代码列表中的2个正则表达式控制代码。
一开始,这是对构造进行分组的唯一方法,而且它还
作为一种捕获机制。
随之而来的是将分组扩展到其他用途的需求。
所以他们开始在开始的括号(<here>后面添加更多的字符
以获得不同的含义。
它已经演变成以下这些分组结构的含义:
(这只是一个示例)
(?: )群集组,不捕获。
(?! )断言,负面展望未来。
(?<! )断言,负面的背后看。
(?= )断言,积极向前看。
(?<= )断言,积极向后看。
(?M)内联修饰符(其中M= s,m,i)。
(?'abc' )命名的捕获组。
(?<abc> )命名捕获组(备用)。
(?P<abc> )命名捕获组(alternative - Python)。
(*abc)回溯控制谓词。
(?(abc) |) Conditional,其中abc可以是许多不同的东西。
(?(DEFINE) )特殊条件定义,其中始终为真
而且它的内容永远不会在主线代码中执行。
这是放置函数定义的地方。
(?# )内联代码注释。
(?> )原子组。
组号的(?1)函数调用。
对命名组的(?&abc)函数调用。
(?{ })代码构造(Perl)。
您还可以注意到,问号?跟在括号后面
而是回溯控制动词。
本例中的问号不是元字符,而是序列的开始标记
标识分组构造是什么的字符。
如果没有前同步码的结束序列(在问号之后),引擎
解析器没有分组构造的真实身份,
因此,它会退回到最后一个有效的分组结构,即通用捕获组
( ).
它开始解析该组的内容。
在您的例子中,第一个结构是一个?。
这是一个修饰对象(它之前的内容)的量词元字符。
由于编译器将分组构造视为已确定的事务,
它抛出了一个错误,这个量词,没有量化任何东西。
( # (1 start)
= ? <-- Quantifies nothing
) # (1 end)发布于 2018-11-12 12:33:16
根据文档,REGEXP_SUBSTR用于获取匹配的子字符串,因此您永远不会得到TRUE,但您可能会得到一个非NULL的答案。
SELECT REGEXP_SUBSTR('(hey)', '\\(\\w+\\)');给出(hey)作为答案
SELECT REGEXP_SUBSTR('(hey)', '\\(\\w+\\)') IS NOT NULL;因此为您提供了TRUE,但它更易于使用
SELECT REGEXP_LIKE('(hey)', '\\(\\w+\\)');https://stackoverflow.com/questions/51866057
复制相似问题