如何不使用'.*?(\d+)', '\1'从JSON列提取键名末尾数字
提取JSON键末尾数字的替代正则方案
针对你需要替换原语句中'.*?(\d+)', '\1'部分的需求,这里提供几个等价的实现方式,都能提取JSON键名末尾的数字并转为ID列:
方案1:移除开头所有非数字字符
直接匹配键名开头的所有非数字内容并替换为空,留下的就是末尾的数字:
REGEXP_REPLACE((json_each_text(fixtures::json)).key, '^\D+', '')::int as ID
原理:^\D+匹配字符串开头的一个或多个非数字字符,替换为空后自然保留末尾的数字序列。
方案2:贪婪匹配捕获末尾数字
将原正则的非贪婪匹配改为贪婪匹配,同样捕获末尾的数字组:
REGEXP_REPLACE((json_each_text(fixtures::json)).key, '.*(\d+)', '\1')::int as ID
原理:.*会贪婪匹配到最后一个数字前的所有内容,(\d+)捕获末尾的连续数字,替换时保留捕获组内容。
方案3:直接提取末尾数字(更直观)
用REGEXP_SUBSTR直接提取末尾的数字序列,无需替换操作:
REGEXP_SUBSTR((json_each_text(fixtures::json)).key, '\d+$')::int as ID
原理:\d+$匹配字符串末尾的一个或多个连续数字,直接提取该部分作为结果。
以上三种方案都能实现和原语句相同的效果,可根据你的习惯选择使用。
内容的提问来源于stack exchange,提问作者user7446890
相关产品推荐
相关产品推荐

