如何编写正则表达式忽略特定数据段中的分隔符?
正则拆分字符串时忽略特定字段内的分隔符
问题场景
现有以/分隔的字符串,常规拆分逻辑REGEXP_SUBSTR(ORGDATA, '(.*?)/|$', 1, COLUMN_VALUE, NULL, 1)能正常拆分:
原始数据:FDTYP/TESTTYPE/FDPERIOD/31 Day(s)/MAT_INST/CREDIT_TO_ACC/DEPTACCT/0016/ 拆分结果:{"FDTYP", "TESTTYPE", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016"}
但当第二个字段包含/时,常规拆分会错误切割该字段:
异常数据:FDTYP/FD2323*/*/*-/FDPERIOD/31 Day(s)/MAT_INST/CREDIT_TO_ACC/DEPTACCT/0016/ 错误结果:{"FDTYP", "FD2323*", "*", "*-", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016"} 期望结果:{"FDTYP", "FD2323*/*/*-", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016"}
解决方案
由于第二个字段的边界固定(FDTYP/之后,/FDPERIOD之前),可以针对不同位置的字段匹配不同规则,用CASE分支结合正则实现正确拆分:
CASE -- 提取第一个字段:从开头到第一个/的内容 WHEN COLUMN_VALUE = 1 THEN REGEXP_SUBSTR(ORGDATA, '^([^/]+)', 1, 1, NULL, 1) -- 提取第二个字段:锁定边界,保留内部/ WHEN COLUMN_VALUE = 2 THEN REGEXP_SUBSTR(ORGDATA, '(?<=FDTYP/)(.*?)(?=/FDPERIOD)', 1, 1, NULL, 1) -- 提取第3及以后的字段:从/FDPERIOD/开始按原逻辑拆分 ELSE REGEXP_SUBSTR(ORGDATA, '(?<=/FDPERIOD/)(.*?)(?=/|$)', 1, COLUMN_VALUE - 2, NULL, 1) END AS DATALABEL
如果想只用一个正则表达式实现(不依赖CASE分支),可以使用带分支的正则,让REGEXP_SUBSTR按位置提取:
REGEXP_SUBSTR(ORGDATA, '(^[^/]+)|(?<=FDTYP/).*?(?=/FDPERIOD)|(?<=/FDPERIOD/)(.*?)(?=/|$)', 1, COLUMN_VALUE, NULL, 1 ) AS DATALABEL
原理说明
- 第一个字段:用
^([^/]+)匹配字符串开头到第一个/的非/字符,确保只取FDTYP。 - 第二个字段:用正向环视
(?<=FDTYP/)和(?=/FDPERIOD)锁定边界,中间的.*?会匹配包括/在内的所有内容,直到遇到/FDPERIOD为止。 - 后续字段:从
/FDPERIOD/之后开始,按原逻辑匹配每个/分隔的字段,用COLUMN_VALUE - 2对应后续字段的顺序。
内容的提问来源于stack exchange,提问作者Amir Hamzah
相关产品推荐
相关产品推荐

