2015-02-10 6 views
0

В приведенном ниже примере:Oracle 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 помог вам? –

+0

Спасибо, но нет. Ваше регулярное выражение удаляет «\» всюду и «-» везде, я просто хочу, чтобы он был удален первым. –

+0

Я использую Oracle 11.2.0.4 –

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)). –

+0

Я почти всегда старше - \ - компенсирую :) –

Смежные вопросы