Spark SQL中正则Lookbehind失效问题及特殊字符提取需求
Spark SQL正则后向断言失效问题解决
问题根源
你当前使用的正则表达式里,后向断言(?<=[0-9]\..*/)包含了可变长度的.*,而Spark依赖的Java风格正则不支持可变长度的后向断言——Java正则要求后向断言匹配的内容必须是固定长度,或者是有限范围的长度(比如{1,5}这种明确区间),*或+这类无限长度量词会导致引擎无法解析,直接匹配失败。
解决方案
放弃后向断言,改用先捕获斜杠后内容,再提取特殊字符的方式,更简单可靠:
1. 提取斜杠后的全部内容
用正则匹配字符串结构,直接捕获斜杠后的部分:
select regexp_extract(t.mystring, '^\\d{2}\\..*/(.*)', 1) as after_slash from mytable t
对示例字符串20.3426999/1234567arw#1:2,会输出:
1234567arw#1:2
2. 提取目标特殊字符
在第一步基础上,用regexp_replace过滤掉非目标特殊字符,保留[;:@&=+$,]中的字符(注意正则里+和$需要转义):
select regexp_replace( regexp_extract(t.mystring, '^\\d{2}\\..*/(.*)', 1), '[^;:@&=\\+\\$,]', '' ) as special_chars from mytable t
对示例字符串会输出:#:
3. 格式化输出为期望的[#, :]
通过字符串拼接和正则调整格式:
select regexp_replace( concat( '[', regexp_replace( regexp_replace(regexp_extract(t.mystring, '^\\d{2}\\..*/(.*)', 1), '[^;:@&=\\+\\$,]', ''), '(.)', '$1, ' ), ']' ), ', ]', ']' ) as formatted_special_chars from mytable t
对示例字符串会输出:
[#, :]
关键说明
- Java正则的后向断言仅支持固定长度或有限范围长度的匹配,避免在其中使用
*、+这类可变长度量词; - 处理特殊字符时,注意正则中具有特殊含义的字符(如
+、$)需要用反斜杠转义,在Spark SQL中要写双反斜杠\\。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

