用oracle REGEXP_REPLACE函数替换字符串的方括号

时间:2013-10-17 06:48:22

标签: regex oracle

我想用REGEXP_REPLACE函数替换字符串中的方括号。即使我逃避这些字符,它也不会取代

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

结果

VMI[[DATA]]INFO

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

3 个答案:

答案 0 :(得分:4)

你可以这样做:

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

但我不认为这里需要正则表达式,你也可以使用TRANSLATE

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

Here is a sqlfiddle demo

答案 1 :(得分:1)

在角色类中,您不需要转义。特殊规则适用于 - ,]和^,原因很明显(参见例如List of metacharacters for MySQL square brackets

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

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

但我同意@ A.B.Cade - 定期表达对此有些过分。

答案 2 :(得分:0)

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

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

因此您的正则表达式将匹配\][]的子字符串。


来自Oracle 12c Documentation

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

要在方括号表达式中指定右括号(]),请将其放在列表中的第一位(如果有首字母抑扬号(^之后)。

要在方括号表达式中指定连字符,请将其放在列表的最前面(如果是首个抑音符(^之后),则在列表的最后,或作为范围表达式的结束范围点

因此,如果要匹配方括号表达式中的右方括号,则它必须是列表中的第一个字符,并且正则表达式应为[][]。第一个[开始括号表达式; ]的第二个字符应与一个方括号匹配; [第三个字符与左方括号字符匹配;最后一个]终止括号表达式。

哪个解决方案为:

SELECT REGEXP_REPLACE(
         'VMI[[DATA]]INFO',
         '[][]',
         '_'
       )
FROM   DUAL;