我想用 REGEXP_REPLACE 函数替换字符串中的方括号。即使我逃脱了这些字符也无法取代
select regexp_replace('VMI[[DATA]]INFO', '[\[\]]', '_') from dual;
结果
VMI[[DATA]]INFO
我们应该怎么做?我错过了什么吗?
你可以这样做:
select regexp_replace('VMI[[DATA]]INFO', '\[|\]', '_') from dual;
但是我觉得这里不需要正则表达式,也可以使用TRANSLATE
select translate('VMI[[DATA]]INFO', '[]', '__') from dual;
在字符类中,您不需要转义。出于显而易见的原因,特殊规则适用于 -、] 和 ^(参见MySQL 方括号的元字符列表)
所以在你的情况下,你可以使用
select regexp_replace('VMI[[DATA]]INFO', '[][]', '_') from dual;
但我同意@ABCade - 正则表达式对此太过分了。
解释正在发生的事情。您的正则表达式[\[\]]
匹配:
[\[\]
匹配\
字符或[
字符或字符的括号表达式\
(因为\
在 Oracle 的正则表达式语法中不是转义字符,但被视为字符文字)。]
字符。因此,您的正则表达式将匹配一个子字符串,即\]
or []
。
用于指定匹配列表的括号表达式,该列表应匹配列表中表示的任何一个表达式。不匹配的列表表达式以抑扬符 (
^
) 开头,并指定与列表中表示的表达式以外的任何字符匹配的列表。要在方括号表达式中指定右方括号 (
]
),请将其放在列表的第一个位置(如果有的话,在初始的抑扬符 (^
) 之后)。要在括号表达式中指定连字符,请将其放在列表的第一个位置(在初始的抑扬符 (
^
) 之后,如果有的话)、最后一个或作为范围表达式中的结束范围点。
所以,如果你想匹配括号表达式中的右方括号,那么它需要是列表中的第一个字符,你的正则表达式应该是[][]
. 第一个[
开始括号表达式;第二]
个字符是匹配右方括号字符;第三[
个字符匹配左方括号字符;最后]
终止括号表达式。
这将给出解决方案:
SELECT REGEXP_REPLACE(
'VMI[[DATA]]INFO',
'[][]',
'_'
)
FROM DUAL;