如何使用REGEXP_SUBSTR捕获第三个间隔后的单词?
如何用正则表达式捕获第三个间隔后的单词
问题分析
给定的文本数据以连续空白符作为间隔,需要提取第三个间隔之后的第一个完整单词。原SQL的正则表达式存在语法错误,且匹配逻辑不符合需求,无法得到期望结果。
数据示例
Y091234ABC 100 DEF100.25 DEF200 DEF300 DEF10000 Y091234ABC 5000.75 DEF25000 DEF200000 DEF3000 DEF10000000 DEF100000
期望结果
DEF200 DEF200000
正确的SQL实现
核心思路
使用REGEXP_SUBSTR函数,通过正则匹配前三个由空白符分隔的字段后,提取下一个非空白符序列。核心逻辑是定位前三个字段的完整范围,再捕获后续的目标单词。
具体SQL语句
Oracle 版本
SELECT REGEXP_SUBSTR(DATA, '^(\S+\s+){3}(\S+)', 1, 1, NULL, 2) AS target_word FROM TBL;
MySQL 版本
SELECT REGEXP_SUBSTR(DATA, '^\\S+\\s+\\S+\\s+\\S+\\s+(\\S+)', 1, 1, '', 1) AS target_word FROM TBL;
正则说明
\S+:匹配一个或多个非空白字符,对应单个字段内容(\S+\s+){3}:重复3次,匹配前三个字段及后续的空白间隔(\S+):捕获第四个字段,也就是第三个间隔后的目标单词- 末尾的数字参数指定返回对应捕获组的内容(Oracle用
2,MySQL用1)
原SQL的问题
原正则\s{3}[A-Z{3}\d+\.\d+存在两处关键错误:
- 语法错误:
[A-Z{3}中左括号未闭合,字符集定义逻辑混乱,正确的字符范围应该是[A-Z0-9.] - 逻辑错误:仅匹配三个空白符后的片段,没有考虑前三个字段的完整结构,无法准确定位到目标位置
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

