正则表达式查找和替换忽略部分匹配

3

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

'(val$1,val$1,val$1,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)'

我想做的是将val$1替换为一些文本,例如XYZ

仅匹配val$1会产生:

'(XYZ,XYZ,XYZ,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,XYZ0,XYZ1,XYZ2)'

如果有人想帮我一把,我想知道正则表达式应该如何忽略末尾的内容,以便得到以下结果:

'(XYZ,XYZ,XYZ,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)'

类似于 \bval\$1\b 的东西 https://regex101.com/r/7bO9ar/1/ - adiga
谢谢您的回复。在 Oracle 之外,情况看起来不错,但是我正在使用它们的 REGEXP_REPLACE,而且 \b 不受支持。有没有其他解决方法? - dunkyduncs
我不熟悉那个。您应该添加相关标签到问题中以达到正确的受众 :) - adiga
好的,谢谢(并添加了标签) - dunkyduncs
如果不支持单词边界,您可以尝试使用 val\$1(,|\))。这只匹配在 val$1 之后带有 ,) 的子字符串。 - adiga
3个回答

0

您可以通过在regexp_replace的模式中添加一个额外的数字\D来实现。

select regexp_replace('(val$1,val$1,val$1,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,
                        val$10,val$11,val$12)','\val\$1(\D)','XYZ\1') as "Result"
  from dual;

Result
----------------------------------------------------------------------------------
(XYZ,XYZ,XYZ,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)

@dunkyduncs 和 Barbaros。如果在结尾处有一个 val$1,那么这会在末尾添加一个额外的逗号,即在 ) 之前。请尝试使用 REGEXP_REPLACE(string, ','\val\$1(\D)','XYZ\1') - Kaushik Nayak
@KaushikNayak,是的,你的解决方案更通用且更好,谢谢。根据我的偏好,我更喜欢第一个。 - Barbaros Özhan
谢谢。在这个例子中,方括号的作用是什么 \val$1([^0-9a-zA-Z])? - dunkyduncs
@dunkyduncs 欢迎,是的,这也可以工作。但我认为没有必要详细地包含所有这些模式元素。 - Barbaros Özhan
我想我已经解决了它:使用 ([^0-9a-z_]) 代替 (\D)。 - dunkyduncs
显示剩余2条评论

0

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

SQL> select replace('(val$1,val$1,val$1,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)',
  2                 'val$1,', 'xyz,') result
  3  from dual;

RESULT
----------------------------------------------------------------------------------
(xyz,xyz,xyz,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)

SQL>

不是期望的结果集,所以需要使用正则表达式。请参见上面的期望输出。谢谢,Duncs。 - dunkyduncs
啊!抱歉,没有注意到字符串的结尾。不管怎样,REPLACE仍然可以完成工作。我修改了之前发布的代码,请看一下。 - Littlefoot
这是哪个小问题 - Littlefoot

0

您还可以搜索"val$1",后面跟着逗号或右括号(如果它恰好在字符串的末尾)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接