BigQuery SQL如何提取首次匹配字符后内容且不含匹配字符
BigQuery 提取字符串首个下划线后内容的实现方案
你之前用的REGEXP_EXTRACT(str, r'_.*')会返回带下划线的结果,是因为正则将匹配到的下划线本身纳入了返回范围,用下面两种方法都可以实现需求,结果完全匹配预期。
方法1:正则捕获组写法(最简洁)
BigQuery的REGEXP_EXTRACT函数支持返回正则中第一个捕获组的匹配内容,你只需要把下划线后需要提取的部分用圆括号包裹成捕获组即可,正则写法为r'_(.*)'。
示例代码:
WITH test_data AS ( SELECT 'hello _I _ am _ 123312' AS input_str UNION ALL SELECT 'Nobody sa_dwdq casc_as _ 1233_12' AS input_str UNION ALL SELECT '_dosjadojs aod jao jdaso j' AS input_str ) SELECT input_str, REGEXP_EXTRACT(input_str, r'_(.*)') AS output_str FROM test_data
运行后返回的结果:
- 原字符串
hello _I _ am _ 123312提取结果为I _ am _ 123312 - 原字符串
Nobody sa_dwdq casc_as _ 1233_12提取结果为dwdq casc_as _ 1233_12 - 原字符串
_dosjadojs aod jao jdaso j提取结果为dosjadojs aod jao jdaso j
方法2:原生字符串函数写法(性能更优)
如果不想用正则,也可以用BigQuery原生的字符串位置查找+截取函数实现,逻辑是先定位第一个下划线的位置,从该位置的下一位开始截取到字符串末尾即可,代码写法:
SUBSTR(input_str, STRPOS(input_str, '_') + 1)
这个写法的返回结果和正则写法完全一致,在处理超长字符串时性能比正则方案更好。
注意:以上两种方案默认输入字符串中至少包含1个下划线,如果你的数据中存在无下划线的字符串,可以加一层判断兼容,例如
IF(STRPOS(input_str, '_') = 0, input_str, 你的提取逻辑),无下划线时可以按需返回原字符串或者空值。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

