【问题标题】:replacing square brackets of a string with oracle REGEXP_REPLACE function用 oracle REGEXP_REPLACE 函数替换字符串的方括号
【发布时间】:2013-10-25 13:07:29
【问题描述】:

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

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

结果

VMI[[DATA]]INFO

我们怎样才能做到这一点?我错过了什么吗?

【问题讨论】:

    标签: regex oracle


    【解决方案1】:

    你可以这样做:

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

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

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

    Here is a sqlfiddle demo

    【讨论】:

    • 作为一个开发者,普遍倾向于使用正则表达式进行替换,对oracle的translate()函数一无所知。现在我按照您的建议使用 translate() 。谢谢
    【解决方案2】:

    在字符类中,您不需要转义。出于显而易见的原因,特殊规则适用于 -、] 和 ^(参见例如 List of metacharacters for MySQL square brackets

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

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

    但我同意@A.B.Cade - 正则表达式对此过于夸张。

    【讨论】:

    【解决方案3】:

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

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

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


    来自Oracle 12c Documentation

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

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

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

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

    这将给出解决方案:

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

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2015-03-12
      • 2021-12-29
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2018-12-26
      相关资源
      最近更新 更多