如何用Oracle正则表达式提取字符串字段的第三个单词
正则提取字符串第三个单词的实现方案
核心正则规则
我们需要跳过前两个由空白分隔的单词,捕获第三个单词,核心正则表达式如下:^\S+\s+\S+\s+(\S+)
各部分含义:
^:锚定字符串起始位置,确保从第一个字符开始匹配\S+:匹配1个及以上非空白字符,对应单个单词\s+:匹配1个及以上空白字符(兼容空格、制表符等分隔符,也支持多个空格分隔的场景)():捕获组,括号内匹配到的内容就是需要提取的第三个单词
如果你的场景要求单词只能用单个空格分隔,也可以用简化版本:^[^ ]+ [^ ]+ ([^ ]+)
不同SQL环境的写法
你当前使用的是查询prod.client表的notes字段,不同数据库的正则提取函数语法略有区别,对应写法如下:
MySQL/MariaDB
SELECT REGEXP_SUBSTR(notes, '^\\S+\\s+\\S+\\s+(\\S+)', 1, 1, 'c', 1) AS third_word FROM prod.client;
最后一位参数1表示返回第一个捕获组的内容。
PostgreSQL
SELECT (regexp_match(notes, '^\S+\s+\S+\s+(\S+)'))[1] AS third_word FROM prod.client;
regexp_match返回匹配结果数组,取下标1即可得到第一个捕获组的内容。
Hive/Spark SQL
SELECT regexp_extract(notes, '^\\S+\\s+\\S+\\s+(\\S+)', 1) AS third_word FROM prod.client;
第三位参数1指定返回第一个捕获组的内容。
Oracle
SELECT REGEXP_SUBSTR(notes, '^\S+\s+\S+\s+(\S+)', 1, 1, NULL, 1) AS third_word FROM prod.client;
验证效果
你提供的所有样例数据都可以正确匹配得到预期结果:
1024 xyxyxyx 138 1025 eivneini 345 4.→ 返回1381028 swswsws 345 24090 bububu_ 1 2.→ 返回3451028 acboru 345 1050 xwindiwf. 1 2.→ 返回3451028 vnufenu 345 350 dnwufbuw 1 2.→ 返回3451113 abudbu 138 1114 bububuw 12.5 1.→ 返回138
内容的提问来源于stack exchange,提问作者Webb
相关产品推荐
相关产品推荐

