如何用正则提取pos/position后数字或首个逗号前最后数字(BigQuery适用)
问题解答
1. 单正则实现方案
仅通过正则完全可以实现该需求,利用正则分支左优先匹配的特性,优先匹配pos/position后的数字,未命中时再匹配第一个逗号前的最后一个符合范围的数字即可。
适配需求的正则表达式为:r'(?i)(?:pos(?:ition)?\s?(100|[1-9]\d?))|(?:^[^,]*?(100|[1-9]\d?)(?=\D*,))'
规则说明:
(?i):开启大小写不敏感匹配,适配可能出现的大写写法- 前半段为优先规则:匹配
pos或position后可选空格跟随的1-100范围内的数字 - 后半段为兜底规则:匹配第一个逗号前的最后一个1-100范围内的数字
- 数字规则
(100|[1-9]\d?)严格覆盖1到100的取值范围,不会匹配到0或者超过100的数值
2. BigQuery SQL实现方案
更推荐拆分逻辑实现,可读性和可维护性更强,不需要写复杂的长正则,示例代码如下:
SELECT -- 你的其他业务字段 input_str, COALESCE( -- 第一步:优先提取pos/position后的目标数字 REGEXP_EXTRACT(input_str, r'(?i)pos(?:ition)?\s?(100|[1-9]\d?)'), -- 第二步:提取不到时,取第一个逗号前的最后一个目标数字 REGEXP_EXTRACT(SPLIT(input_str, ',')[SAFE_OFFSET(0)], r'(100|[1-9]\d?)\D*$') ) AS position FROM `你的表名`
说明:
SPLIT(input_str, ',')[SAFE_OFFSET(0)]直接截取第一个逗号之前的所有内容,避免正则匹配逗号的边界问题COALESCE函数会按顺序返回第一个非空的结果,刚好适配要求的优先级规则SAFE_OFFSET可以避免部分字符串没有逗号时出现的下标越界错误
内容的提问来源于stack exchange,提问作者fillipvt
相关产品推荐
相关产品推荐

