RegExp 查找和替换忽略部分匹配

RegExp Find and Replace ignoring part matches

我有一个格式如下的字符串:

'(val,val,val,val,val,val,val,val,val,val,val,val,val,val)'

我想做的是用一些文本替换 val,例如XYZ

只匹配 val 会产生:

'(XYZ,XYZ,XYZ,val,val,val,val,val,val,val,val,XYZ0,XYZ1,XYZ2)'

如果有人愿意帮助我,我很想知道什么 reg exp 会忽略末尾的那些,因此生成的字符串如下所示:

'(XYZ,XYZ,XYZ,val,val,val,val,val,val,val,val,val,val,val)'

您可以通过 \Dregexp_replace

的模式中添加一个额外的数字
select regexp_replace('(val,val,val,val,val,val,val,val,val,val,val,
                        val,val,val)','\val$1(\D)','XYZ') as "Result"
  from dual;

Result
----------------------------------------------------------------------------------
(XYZ,XYZ,XYZ,val,val,val,val,val,val,val,val,val,val,val)

你真的需要正则表达式吗?对于好的旧 REPLACE 函数来说,这看起来是一项简单的任务。如果您需要处理大量数据,正则表达式可能会慢很多。

SQL> select replace('(val,val,val,val,val,val,val,val,val,val,val,val,val,val)',
  2                 'val,', 'xyz,') result
  3  from dual;

RESULT
----------------------------------------------------------------------------------
(xyz,xyz,xyz,val,val,val,val,val,val,val,val,val,val,val)

SQL>

您还可以搜索 "val",其中后跟逗号或右括号(如果恰好位于字符串末尾)。

'val$1(,|\)', 'XYZ'