SparkSQL正则提取空格前子串:Athena正则迁移失效求助
解决SparkSQL中REGEXP_EXTRACT提取子串的问题
我来帮你排查这个问题,其实核心是SparkSQL的REGEXP_EXTRACT函数的捕获组规则和你写的正则有两点不匹配:
- 首先,你用的正则
'X10003([^\s]+)'里,括号只把X10003后面的部分圈成了捕获组,而SparkSQL的REGEXP_EXTRACT默认会提取第一个捕获组的内容,而不是整个正则匹配的结果。这就是为什么你得到的是-10447-XXX-20443开头的内容——它只取了X10003之后的部分。 - 其次,你提到结果包含
(CAMP),这大概率是因为你实际写的正则可能出错了(比如不小心用了.代替[^\s]+)。.会匹配任何字符包括空格,所以会一直匹配到字符串末尾;而[^\s]+是匹配所有非空格字符,应该会在遇到X10003后面的第一个空格时停止,不会包含后面的括号内容。
正确写法1:指定提取整个匹配结果(idx=0)
REGEXP_EXTRACT("5570 - Site 811111 - X10003-10447-XXX-20443 (CAMP)", 'X10003[^\s]+', 0)
这里X10003[^\s]+的逻辑很直接:从X10003开始,匹配所有非空格字符直到第一个空格为止。最后指定第三个参数0,表示提取整个正则匹配的内容,而不是某个捕获组。
正确写法2:把目标内容放在捕获组里
REGEXP_EXTRACT("5570 - Site 811111 - X10003-10447-XXX-20443 (CAMP)", '(X10003[^\s]+)')
这次我们把整个想要的内容(X10003加上后面的非空格字符)放在一个捕获组里,因为REGEXP_EXTRACT默认提取第一个捕获组(参数idx默认是1),所以这样也能得到你需要的X10003-10447-XXX-20443。
另外补充下:你之前在Athena用的'X10033.*?\w+-\d+'其实逻辑不够精准,它依赖后续字符的格式来停止匹配,而用X10003[^\s]+的写法更直接贴合你的需求——明确提取到空格为止的内容。
内容的提问来源于stack exchange,提问作者shzyincu
相关产品推荐
相关产品推荐

