Presto SQL 使用REGEXP_EXTRACT提取特定字符串后内容出错如何解决
修正方案
问题根因
- 未指定捕获组序号时,
REGEXP_EXTRACT默认返回正则匹配到的完整字符串,所以会把前缀的问题描述也一起返回 - 原有正则末尾的
(?=)是无匹配规则的正向零宽断言,惰性匹配.*?遇到该断言会直接终止匹配,无法获取到后续的地点内容
修正写法
写法1(适用于Hive、Spark SQL、BigQuery等绝大多数支持正则的SQL引擎)
指定捕获组序号为1,仅返回需要的地点部分:
LTRIM(RTRIM(REGEXP_EXTRACT(description_text, 'What is your vendor location\\?:\\s*(.*?)(?=\\n|$)', 1))) AS vendor_location
说明:正则中的
\\s*会自动匹配冒号后的所有空格,(?=\\n|$)表示匹配到换行符或者字符串末尾就停止,哪怕后续还有其他表单字段也不会错误截取。
写法2(零宽断言版本,无需指定捕获组)
如果所用SQL环境不支持REGEXP_EXTRACT的第三个捕获组参数,可以用正向后顾断言直接定位到前缀之后的内容:
LTRIM(RTRIM(REGEXP_EXTRACT(description_text, '(?<=What is your vendor location\\?:\\s).*?(?=\\n|$)'))) AS vendor_location
内容的提问来源于stack exchange,提问作者Talita Oliveira
相关产品推荐
相关产品推荐

