谷歌BigQuery是否支持不区分大小写的正则表达式匹配?

12
在Google BigQuery中,我想检查是否存在'confirm'或'Confirm':
REGEXP_CONTAINS(h.page.PagePath, r'Confirm') or
REGEXP_CONTAINS(h.page.PagePath, r'confirm'))

我是一名Perl程序员,而在Perl中我们这么做

$foo =~ /confirm/i    # case-insensitive

Google BigQuery有没有修改REGEXP_MATCH的标志?我在他们的在线文档中没有看到任何示例。

2个回答

31

REGEXP_CONTAINS 使用RE2库,因此您可以像这样使用内联修饰符:

REGEXP_CONTAINS(h.page.PagePath, r'(?i)confirm') 
                                   ^^^^  

请查看 RE2 文档:

(?flags)    在当前组内设置标志位;非捕获性 ...
            标志位
i  忽略大小写(默认为 false)
m  多行模式:除了匹配文本的开始和结束位置之外,还将匹配行首和行尾(默认为 false)
s  让 . 匹配 \n(默认为 false)
U  非贪婪模式:交换 x*, x*?, x+, x+? 等的含义(默认为 false)

标志语法为 xyz (设置)或 -xyz (取消设置)或 xy-z (设置 xy,取消设置 z)。


1
这是一种有趣的添加标志的方式。我尝试了它(请注意,我在Google Big Query环境中,并且在此环境中,我使用的是Standard SQL而不是Legacy SQL)。所以我尝试了这个:REGEXP_CONTAINS(h.page.PagePath, r'(?i)Confirm'),但我收到了这个消息:查询失败 错误:语法错误:无法将带括号的表达式解析为表达式、结构体构造函数或子查询 [30:22] - Mark Ginsburg
SQL不支持正则表达式。但是你可以创建一个UDF。 - Wiktor Stribiżew
你可以始终解决硬编码的情况:'[cC][oO][nN][fF][iI][rR][mM]' - Wiktor Stribiżew
3
在BigQuery中,(?i)可以正常工作 - 这里是一个例子:SELECT REGEXP_CONTAINS(text, r'(?i)confirm'), REGEXP_CONTAINS(text, r'confirm') FROM (SELECT 'I Confirm that it works' text)。请提供您实际的查询语句以查看错误的原因。 - Mosha Pasumansky
更新,我打错了字,r'(?i)somestring' 的作用是正确的。这个可以正常工作:当REGEXP_CONTAINS(h.page.PagePath, r'(?i)Confirm')时,那么就是'XYZZY'。 - Mark Ginsburg

0

虽然不太优雅,但我刚刚使用了这个:

REGEXP_CONTAINS(UPPER(sources), "CLAIMS")

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