【问题标题】:Oracle REGEXP to replace only the first characterOracle REGEXP 仅替换第一个字符
【发布时间】:2015-04-11 02:14:45
【问题描述】:

在下面的例子中:

WITH X(DATA, ORD)
AS
(         
Select '@asdf@'   , 01 FROM DUAL UNION
Select '\qw@er\'  , 02 FROM DUAL UNION
Select '-zxcv-@' , 03  FROM DUAL UNION
Select '_poiu@' ,  04 FROM DUAL 
)

SELECT
REGEXP_REPLACE(DATA, '[@\-_]', '', 1)
FROM X
ORDER BY ORD;  
;  

我收到以下回复:

asdf 
qwer
-zxcv- 
poiu

但我想替换“@”、“\”、“-”或“_”,前提是它是字符串的第一个字符,而不是中间。 此外,它不适用于“-”字符。

【问题讨论】:

    标签: regex oracle regexp-replace


    【解决方案1】:

    以下正则表达式应该可以工作:^[@\\_-]。请注意,破折号- 必须是字符类中的最后一个字符。

    WITH X AS (
      SELECT '@asdf@' AS data, 01 AS ord FROM DUAL UNION
      SELECT '\qw@er\', 02 FROM DUAL UNION
      SELECT '-zxcv-@', 03  FROM DUAL UNION
      SELECT '_poiu@',  04 FROM DUAL 
    )
    SELECT REGEXP_REPLACE(DATA, '^[@\\_-]')
     FROM X
    ORDER BY ORD
    

    【讨论】:

    • 这没有什么坏处,但你甚至不需要双反斜杠;无论如何,它在方括号matching character list 内是一个字面意思,没有特殊含义。 (破折号可以排在第一位,也可以排在最后,只是不在表示范围的中间——demo)。
    • 我几乎总是过度-\-补偿:)
    【解决方案2】:

    改为使用这个

    REGEXP_REPLACE(DATA, '^[@|\\|-|_]', '', 1)
    

    注意指定字符串开头的^ 字符。

    查询

    WITH X(DATA, ORD)
    AS
    (         
    Select '@asdf@'   , 01 FROM DUAL UNION
    Select '\qw@er\'  , 02 FROM DUAL UNION
    Select '-zxcv-@' , 03  FROM DUAL UNION
    Select '_poiu@' ,  04 FROM DUAL 
    )
    SELECT
    REGEXP_REPLACE(DATA, '^[@|\\|-|_]', '', 1)
    FROM X
    ORDER BY ORD; 
    

    给我结果

    asdf@, qw@er, zxcv@, poiu@,

    【讨论】:

    • @CraigStevensson 我的回答对你有帮助吗?
    • 谢谢,但没有。您的正则表达式正在到处删除“\”和到处的“-”,我只想将它删除第一个。
    • 我使用的是 Oracle 11.2.0.4
    • 您不需要字符类中的那些管道 | 字符 - 以下就足够了:^[@\\_-]。请注意,我将破折号放在最后,否则它在 [] 中包含的字符类中具有特殊含义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多