0

我想用 REGEXP_REPLACE 函数替换字符串中的方括号。即使我逃脱了这些字符也无法取代

select regexp_replace('VMI[[DATA]]INFO', '[\[\]]', '_') from dual;

结果

VMI[[DATA]]INFO

我们应该怎么做?我错过了什么吗?

4

3 回答 3

7

你可以这样做:

select regexp_replace('VMI[[DATA]]INFO', '\[|\]', '_') from dual;

但是我觉得这里不需要正则表达式,也可以使用TRANSLATE

select translate('VMI[[DATA]]INFO', '[]', '__') from dual;

这是一个 sqlfiddle 演示

于 2013-10-17T07:04:11.133 回答
3

在字符类中,您不需要转义。出于显而易见的原因,特殊规则适用于 -、] 和 ^(参见MySQL 方括号的元字符列表

所以在你的情况下,你可以使用

select regexp_replace('VMI[[DATA]]INFO', '[][]', '_') from dual;

但我同意@ABCade - 正则表达式对此太过分了。

于 2013-10-17T07:37:28.677 回答
0

解释正在发生的事情。您的正则表达式[\[\]]匹配:

  • [\[\]匹配\ 字符或[字符或字符的括号表达式\ (因为\ 在 Oracle 的正则表达式语法中不是转义字符,但被视为字符文字)。
  • 后面跟着一个]字符。

因此,您的正则表达式将匹配一个子字符串,即\]or []


来自Oracle 12c 文档

用于指定匹配列表的括号表达式,该列表应匹配列表中表示的任何一个表达式。不匹配的列表表达式以抑扬符 ( ^) 开头,并指定与列表中表示的表达式以外的任何字符匹配的列表。

要在方括号表达式中指定右方括号 ( ]),请将其放在列表的第一个位置(如果有的话,在初始的抑扬符 ( ^) 之后)。

要在括号表达式中指定连字符,请将其放在列表的第一个位置(在初始的抑扬符 ( ^) 之后,如果有的话)、最后一个或作为范围表达式中的结束范围点。

所以,如果你想匹配括号表达式中的右方括号,那么它需要是列表中的第一个字符,你的正则表达式应该是[][]. 第一个[开始括号表达式;第二]个字符是匹配右方括号字符;第三[个字符匹配左方括号字符;最后]终止括号表达式。

这将给出解决方案:

SELECT REGEXP_REPLACE(
         'VMI[[DATA]]INFO',
         '[][]',
         '_'
       )
FROM   DUAL;
于 2020-05-12T11:08:51.180 回答