oracle - Oracle regexp_replace 挑选出模式匹配组
问题描述
我正在努力从 Oracle 11g 中的字符串中获取与模式匹配的组。它几乎可以工作了,但我不明白为什么最后的不匹配部分仍然存在:
select regexp_replace('ST1_12 text1, KG32_1 text2, VI7_08 text3','.*?(\w+\d+_\d+).*','\1,') c1
from dual
当前结果:ST1_12,KG32_1,VI7_08, text3
预期结果:ST1_12,KG32_1,VI7_08
在我看来,结尾部分不包含在搜索模式中,只是简单地粘在了结尾,但是如何摆脱它呢?
解决方案
text3
在匹配第三组后,它开始从;中寻找下一个匹配项。尾随.*
被有效地忽略了。对于较早的组,这就是您想要的 - 否则.*
第一组的尾随将包括字符串的其余部分,您将丢失其他组。当它从它开始时 text3
找不到另一个匹配项,因此返回原始值(当时)。
如果这些值始终以逗号分隔,那么您可以在匹配项中包含逗号或字符串结尾锚点,以使其包含剩余的文本 - 直到空格 - 但不在\1
:
select regexp_replace('ST1_12 text1, KG32_1 text2, VI7_08 text3','.*?(\w+\d+_\d+).*(,|$)', '\1,') c1
from dual;
ST1_12,KG32_1,VI7_08,
您可以使用修剪功能摆脱尾随逗号:
select rtrim(regexp_replace('ST1_12 text1, KG32_1 text2, VI7_08 text3','.*?(\w+\d+_\d+).*(,|$)','\1,', 1, 0, null),
',') as c1
from dual;
ST1_12,KG32_1,VI7_08
另一个不依赖于现有逗号的选项是将字符串拆分为多个值:
select regexp_substr('ST1_12 text1, KG32_1 text2, VI7_08 text3', '(\w+\d+_\d+)', 1, level, null, 1) as c1
from dual
connect by level <= regexp_count('ST1_12 text1, KG32_1 text2, VI7_08 text3', '(\w+\d+_\d+)');
ST1_12
KG32_1
VI7_08
然后将它们聚合在一起:
select listagg(
regexp_substr('ST1_12 text1, KG32_1 text2, VI7_08 text3', '(\w+\d+_\d+)', 1, level, null, 1),
',') within group (order by level) as c1
from dual
connect by level <= regexp_count('ST1_12 text1, KG32_1 text2, VI7_08 text3', '(\w+\d+_\d+)');
ST1_12,KG32_1,VI7_08
推荐阅读
- python - pine 脚本如何使用 2 个系列而不是 1 个和一个句点来计算 RSI?
- java - 返回数组类
- python - Django:显示模型字段中的图像?
- three.js - three.js obj + mtl 不起作用
- javascript - 通过 jquery 的表格编辑器
- apache-spark - Windows 上的 Pyspark:WARN 无法加载 NativeSystemBLAS 和 NativeRefBLAS
- php - 如何为所有 php 页面定义一个变量?
- sql - SQL Server - 获取第一个和最后一个(按日期时间)DataPoints 值
- java - 构建器模式的抽象类
- entity-framework - 如何删除与同一张表具有 1:1 关系的行?