我想用REGEXP_REPLACE函数替换字符串中的方括号。即使我逃避这些字符,它也不会取代
select regexp_replace('VMI[[DATA]]INFO', '[\[\]]', '_') from dual;
结果
VMI[[DATA]]INFO
我们怎么做?我错过了什么吗?
答案 0 :(得分:4)
你可以这样做:
select regexp_replace('VMI[[DATA]]INFO', '\[|\]', '_') from dual;
但我不认为这里需要正则表达式,你也可以使用TRANSLATE
select translate('VMI[[DATA]]INFO', '[]', '__') from dual;
答案 1 :(得分:1)
在角色类中,您不需要转义。特殊规则适用于 - ,]和^,原因很明显(参见例如List of metacharacters for MySQL square brackets)
所以在你的情况下,你可以使用
select regexp_replace('VMI[[DATA]]INFO', '[][]', '_') from dual;
但我同意@ A.B.Cade - 定期表达对此有些过分。
答案 2 :(得分:0)
说明正在发生的事情。您的正则表达式[\[\]]
匹配:
[\[\]
与\
字符或[
字符或\
字符匹配(因为\
不是转义字符) Oracle的正则表达式语法,但被视为字符文字。)]
字符。因此您的正则表达式将匹配\]
或[]
的子字符串。
括号表达式,用于指定匹配列表,该列表应与列表中表示的任何一个表达式匹配。不匹配的列表表达式以抑音符(
^
)开头,并指定一个匹配除列表中表示的表达式之外的任何字符的列表。要在方括号表达式中指定右括号(
]
),请将其放在列表中的第一位(如果有首字母抑扬号(^
之后)。要在方括号表达式中指定连字符,请将其放在列表的最前面(如果是首个抑音符(
^
之后),则在列表的最后,或作为范围表达式的结束范围点
因此,如果要匹配方括号表达式中的右方括号,则它必须是列表中的第一个字符,并且正则表达式应为[][]
。第一个[
开始括号表达式; ]
的第二个字符应与一个方括号匹配; [
第三个字符与左方括号字符匹配;最后一个]
终止括号表达式。
哪个解决方案为:
SELECT REGEXP_REPLACE(
'VMI[[DATA]]INFO',
'[][]',
'_'
)
FROM DUAL;