【发布时间】:2013-10-25 13:07:29
【问题描述】:
我想用 REGEXP_REPLACE 函数替换字符串中的方括号。即使我逃脱了这些字符,它也无法取代
select regexp_replace('VMI[[DATA]]INFO', '[\[\]]', '_') from dual;
结果
VMI[[DATA]]INFO
我们怎样才能做到这一点?我错过了什么吗?
【问题讨论】:
我想用 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;
【讨论】:
在字符类中,您不需要转义。出于显而易见的原因,特殊规则适用于 -、] 和 ^(参见例如 List of metacharacters for MySQL square brackets)
所以在你的情况下,你可以使用
select regexp_replace('VMI[[DATA]]INFO', '[][]', '_') from dual;
但我同意@A.B.Cade - 正则表达式对此过于夸张。
【讨论】:
解释正在发生的事情。您的正则表达式 [\[\]] 匹配:
[\[\] 匹配\ 字符或[ 字符或\ 字符(因为\ 在Oracle 的正则表达式语法中不是转义字符,但被视为字符字面意思)。] 字符。因此,您的正则表达式将匹配 \] 或 [] 的子字符串。
用于指定匹配列表的括号表达式,该列表应匹配列表中表示的任何一个表达式。不匹配的列表表达式以抑扬符 (
^) 开头,并指定与列表中表示的表达式以外的任何字符匹配的列表。要在方括号表达式中指定右方括号 (
]),请将其放在列表的第一个位置(如果有的话,在初始抑扬符 (^) 之后)。要在括号表达式中指定连字符,请将其放在列表的第一个位置(在初始的抑扬符 (
^) 之后,如果有的话)、最后一个或作为范围表达式中的结束范围点。
所以,如果你想匹配括号表达式中的右方括号,那么它需要是列表中的第一个字符,并且你的正则表达式应该是[][]。第一个[ 开始括号表达式; ] 第二个字符是匹配右方括号字符; [ 第三个字符匹配左方括号字符;最后的] 终止括号表达式。
这将给出解决方案:
SELECT REGEXP_REPLACE(
'VMI[[DATA]]INFO',
'[][]',
'_'
)
FROM DUAL;
【讨论】: