Hive字符串提取:如何获取特定子串后的固定长度字符?
高效提取URL中指定位置字符的解决方案
嘿,我太懂你之前折腾嵌套REGEXP_REPLACE还要写一堆CASE语句的痛苦了——其实完全不用这么麻烦,咱们用正则捕获组就能一步到位精准提取目标内容,彻底告别繁琐的分支判断!
针对你给出的URL示例(比如https://ysd.com/ert490ghlkh/gsum),核心需求是提取.com/之后的连续11个字符,不管后面的后缀内容怎么变化。这里直接用正则提取函数就能搞定,不同SQL方言的写法大同小异,我给你列几个常用的:
1. BigQuery 写法
SELECT REGEXP_EXTRACT(url_column, r'\.com/(.{11})') AS target_11_chars FROM your_table
2. PostgreSQL 写法
SELECT substring(url_column FROM '\.com/(.{11})') AS target_11_chars FROM your_table;
3. MySQL 8.0+ 写法
SELECT REGEXP_SUBSTR(url_column, '\\.com/(.{11})', 1, 1, 'c', 1) AS target_11_chars FROM your_table;
正则逻辑说明
\.com/:匹配固定的.com/片段(注意正则里.是通配符,必须用\转义才能匹配真实的点号)(.{11}):这是捕获组,专门抓取后面连续的11个任意字符——不管后续的/gsum这类内容怎么变,都不会干扰我们提取这11个目标字符
如果担心有些URL的.com/之后不足11个字符,你可以加个简单的空值处理,比如用IFNULL或者COALESCE兜底:
-- BigQuery示例,处理长度不足的情况 SELECT IF( LENGTH(REGEXP_EXTRACT(url_column, r'\.com/(.*)')) >= 11, REGEXP_EXTRACT(url_column, r'\.com/(.{11})'), NULL ) AS target_11_chars FROM your_table
这种写法比嵌套替换简洁太多,而且扩展性极强,后续不管URL末尾的内容怎么修改,都不需要调整代码~
内容的提问来源于stack exchange,提问作者Thiru Veeran
相关产品推荐
相关产品推荐

