You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式忽略特定数据段中的分隔符?

正则拆分字符串时忽略特定字段内的分隔符

问题场景

现有以/分隔的字符串,常规拆分逻辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:17:38