SQL正则表达式适配求助:regexp_substr正则在应用中报错需调整
SQL字符串解析替代正则方案
问题背景
需要解析字符串 InstanceID="080\\9118547FEE0F3281\\cdcinvio1d1-1-\\2\\40000974084BD525\\false\\3000547FEE0F3280",提取9118547FEE0F3281、40000974084BD525、3000547FEE0F3280三个子串,原正则因语法问题在应用中报错,以下是可行替代方案。
替代正则写法
方案1:精准匹配分隔符后的目标片段
利用[^\\\\]+匹配非反斜杠字符(SQL中反斜杠需双重转义),通过捕获组提取目标内容:
- 提取
9118547FEE0F3281:regexp_substr(str, '^InstanceID="[^\\\\]+\\\\([^\\\\]+)', 1, 1, null, 1) - 提取
40000974084BD525:regexp_substr(str, '^InstanceID="[^\\\\]+\\\\[^\\\\]+\\\\[^\\\\]+\\\\[^\\\\]+\\\\([^\\\\]+)', 1, 1, null, 1) - 提取
3000547FEE0F3280:regexp_substr(str, '^InstanceID="[^\\\\]+\\\\[^\\\\]+\\\\[^\\\\]+\\\\[^\\\\]+\\\\[^\\\\]+\\\\[^\\\\]+\\\\([^\\\\]+)"$', 1, 1, null, 1)
方案2:按分隔符拆分后取对应位置(更简洁)
不同SQL方言有更简便的字符串拆分方式,示例如下:
Oracle
-- 提取9118547FEE0F3281 SELECT regexp_substr(str, '[^\\\\]+', 1, 2) FROM dual; -- 提取40000974084BD525 SELECT regexp_substr(str, '[^\\\\]+', 1, 5) FROM dual; -- 提取3000547FEE0F3280 SELECT regexp_substr(str, '[^\\\\]+', 1, 7) FROM dual;
MySQL
-- 提取9118547FEE0F3281 SELECT substring_index(substring_index(str, '\\\\', 3), '\\\\', -1); -- 提取40000974084BD525 SELECT substring_index(substring_index(str, '\\\\', 6), '\\\\', -1); -- 提取3000547FEE0F3280 SELECT substring_index(substring_index(str, '\\\\', 8), '\\\\', -1);
语法说明
原正则\\([^\]+)存在语法错误:[^\]是不完整的字符集定义,正确的“非反斜杠”字符集应写为[^\\],在SQL环境中需双重转义为[^\\\\],避免解析报错。
内容的提问来源于stack exchange,提问作者EdB
相关产品推荐
相关产品推荐

