Teradata中使用REGEXP_SUBSTR提取两个^分隔符之间字符串的问题
Teradata中使用REGEXP_SUBSTR提取两个^分隔符之间字符串的问题
嘿,我来帮你搞定这个Teradata正则提取的问题~
你现在的目标是从ABCD^1234567890^1这个字符串里提取中间的1234567890对吧?先说说你之前写法为啥没成功:
- 正则里的
^是特殊元字符,代表字符串的开头,不是你要匹配的那个脱字符^,要匹配实际的^得加反斜杠转义成\^才行; - 就算转义了,你写的
(?<=^).*?(?=^)逻辑也不对,相当于找“字符串开头之后、字符串开头之前”的内容,这根本不存在,自然拿不到结果。
给你两种靠谱的解决方法:
方法一:直接按分隔符取第N段(最简单)
Teradata的REGEXP_SUBSTR支持指定提取第几个匹配的片段,针对这种用^分隔的固定格式,直接这么写就行:
REGEXP_SUBSTR(x, '[^^]+', 1, 2)
解释一下:
[^^]+:匹配任意不是^的字符,用来匹配分隔后的每一段内容;1:从字符串的第1个字符开始查找;2:提取第2个匹配到的片段,刚好就是两个^之间的数字串。
方法二:用正向预查精准匹配(适合复杂场景)
如果你更倾向用预查的写法,修正后的正则应该是这样:
REGEXP_SUBSTR(x, '(?<=\^)[^^]*(?=\^)')
解释:
(?<=\^):正向预查,确保当前位置的前面是^;[^^]*:匹配任意数量的非^字符;(?=\^):正向预查,确保当前位置的后面是^;
这样就能精准定位到两个^之间的内容了。
你可以试试这两种写法,第一种更简洁,适合这种固定分隔的场景哦~
备注:内容来源于stack exchange,提问作者Captain C
相关产品推荐
相关产品推荐

