oracle 用于从逗号分隔列表中的每个条目中删除一部分文本的正则表达式

qjp7pelc  于 2023-01-20  发布在  Oracle
关注(0)|答案(2)|浏览(183)

我有一个逗号分隔值的字符串,为了显示的目的,我想把它修剪一下。
该字符串是一个逗号分隔的值列表,这些值的长度和列表条目的数量各不相同。
列表中的每个条目都被格式化为“##-NX”格式的五字符模式,后跟一些文本。
例如,“01-NX部分文本、02-NX更多文本、09-NX其他文本、12-NX等......”
是否有正则表达式函数可以用来删除列表中每个条目的5个字符前缀部分之后的文本,返回“01-NX,02-NX,09-NX,12-NX,..."?
我是一个正则表达式的新手,我还没有弄清楚如何编码的模式。

ohfgkhjo

ohfgkhjo1#

我觉得你需要的是

regexp_replace(regexp_replace(mystring, '(\d{2}-NX)(.*?)(,)', '\1\3'), '(\d{2}.*NX).*', '\1')

内部的REGEXP_REPLACE查找类似nn-NX(两个数字字符后跟“-NX”)的模式以及下一个逗号之前的任意数量的字符,然后用第一个和第三个术语替换它,去掉“任意数量的字符”部分。
外部的REGEXP_REPLACE查找一种模式,如两个数字字符后跟任意数量的字符,直到最后一个NX,并保留字符串的这一部分。
下面是我用于测试的Oracle代码:

with a as (
  select '01-NX sometext, 02-NX morertext, 09-NX othertext, 12-NX etc.' as myString
  from dual
)
select mystring
, regexp_replace(regexp_replace(mystring, '(\d{2}-NX)(.*?)(,)', '\1\3'), '(\d{2}.*NX).*', '\1') as output
from a
qnakjoqk

qnakjoqk2#

此替代方法调用REGEXP_REPLACE()一次。
匹配2个数字、一个短划线和“NX”,后跟任意数量的零个或多个字符(非贪婪),其中后跟逗号或字符串结尾。替换为第一组和第三组,这两组将是逗号或字符串结尾。
编辑:采纳了dougp的建议,通过添加第三个捕获组来消除RTRIM。谢谢!

WITH tbl(str) AS (
  SELECT '01-NX sometext, 02-NX morertext, 09-NX othertext, 12-NX etc.' FROM dual
)
SELECT 
REGEXP_REPLACE(str, '(\d{2}-NX)(.*?)(,|$)', '\1\3') str
from tbl;

相关问题