如何在BigQuery中为RE2正则表达式的捕获分组启用标志?
在BigQuery的RE2正则中使用i/s标志并保留捕获分组的方法
问题背景
基于Google RE2正则库的BigQuery REGEXP_REPLACE场景下,需要实现:
- 开启
i(不区分大小写)和s(点匹配换行)模式 - 保留捕获分组的可引用性,不能将分组转为RE2规定的非捕获分组
- 示例输入:
My name is X、my Name is Y、MY NAME is Z,需将X/Y/Z替换为常量C,同时保留原开头的大小写格式,输出如My name is C
之前尝试用(?is:My name is )(\w+)的写法,导致第一个分组变为非捕获分组,无法通过\1引用原开头内容,无法满足需求。
解决方案
将模式修饰符(?is)放在正则表达式的最开头,作用于整个表达式,这样既开启了需要的模式,又不会影响捕获分组的定义。
BigQuery代码示例
SELECT str AS original_str, REGEXP_REPLACE(str, r'(?is)(My name is )(\w+)', r'\1C') AS replaced_str FROM UNNEST([ 'My name is X', 'my Name is Y', 'MY NAME is Z' ]) AS str
说明
(?is)作为全局模式修饰符,放在正则最前端,对整个表达式生效,同时不改变后续分组的捕获属性- 第一个捕获分组
(My name is )会匹配原字符串中对应的开头部分(保留原大小写),替换时通过\1引用该内容 - 第二个捕获分组
(\w+)匹配需要替换的X/Y/Z,替换时直接用常量C覆盖这部分,最终得到保留原开头格式的目标字符串
内容的提问来源于stack exchange,提问作者Abbas Gadhia
相关产品推荐
相关产品推荐

