2015-02-10 86 views
0

在下面的例子:甲骨文REGEXP只替換第一個字符

WITH X(DATA, ORD) 
AS 
(   
Select '@[email protected]' , 01 FROM DUAL UNION 
Select '\[email protected]\' , 02 FROM DUAL UNION 
Select '[email protected]' , 03 FROM DUAL UNION 
Select '[email protected]' , 04 FROM DUAL 
) 

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

我得到這樣的迴應:

asdf 
qwer 
-zxcv- 
poiu 

但我想,以取代「@」,或「\ 「或」 - 「或」_「僅當它是字符串上的第一個字符時,不在中間。 加上它不適用於「 - 」字符。

回答

1

相反,使用這個

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

通知的^字符用於指定字符串的開頭。

查詢

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

給我的結果

ASDF @,QW @呃,ZXCV @,poiu @,

+0

@CraigStevensson對我的回答有幫助嗎? – 2015-02-10 22:31:45

+0

謝謝,但沒有。你的正則表達式是隨處移除「\」和「 - 」,我只是希望它被刪除的第一個。 – 2015-02-10 22:37:37

+0

我正在使用Oracle 11.2.0.4 – 2015-02-10 22:43:07

2

以下的正則表達式應該工作:^[@\\_-]。請注意,短劃線-必須是角色類中的最後一個字符。

WITH X AS (
    SELECT '@[email protected]' AS data, 01 AS ord FROM DUAL UNION 
    SELECT '\[email protected]\', 02 FROM DUAL UNION 
    SELECT '[email protected]', 03 FROM DUAL UNION 
    SELECT '[email protected]', 04 FROM DUAL 
) 
SELECT REGEXP_REPLACE(DATA, '^[@\\_-]') 
FROM X 
ORDER BY ORD 
+0

它沒有傷害,但你甚至不需要雙反斜槓;它在方括號[匹配字符列表](http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_regexp.htm#CHDIEGEI)中是一個字面值,沒有特殊含義。 (破折號可以首先或最後一個,只是不在表示範圍的中間 - [demo](http://sqlfiddle.com/#!4/d41d8/40568))。 – 2015-02-10 23:33:40

+0

我幾乎總是 - - 補償:) – 2015-02-10 23:34:41