2015-05-27 1 views
1

Я пытаюсь использовать функцию Oracle REGEXP_REPLACE для замены пробела (который находится в середине строки) с пустой строкой.Oracle REGEXP_REPLACE заменяет пространство посередине пустой строкой

Один из моих столбцов содержит строки, подобные следующим.

  • [алфавитно-цифровой] [пробел] [цифра] [пробел] [альфа] (например. R4SX 315 GFX)

Теперь, мне нужно заменить только вторые пропуска (пробела после цифр) с пустой строкой (т.е. R4SX 315 GFX ->R4SX 315GFX)

Для достижения этой цели, я попытался следующий код:

SELECT REGEXP_REPLACE(
    'R4SX 315 GFX', 
    '([:alphanum:])\s(\d)\s([:alpha:])', 
    '\1 \2\3') "REPLACED" 
FROM dual; 

Однако результат, который я получаю, совпадает с моим вводом (т. R4SX 315 GFX). Может кто-нибудь, пожалуйста, скажите мне, что я сделал неправильно, и, пожалуйста, укажите мне в правильном направлении.

Заранее спасибо.

+0

Это должно быть 'alnum', а не' alphanum' – Noel

+0

Спасибо за быстрый ответ. Но я попробовал это, прежде чем публиковать этот вопрос. Все тот же результат. :( – Asela

ответ

1

[: alphanum:]

alphanum является incorrrect. Класс буквенно-цифровых символов: [[:alnum:]].

Вы можете использовать следующую шаблон в regexp_replace:

([[:alnum:]]{4})([[:space:]]{1})([[:digit:]]{3})([[:space:]]{1})([[:alpha:]]{3}) 

Использование REGEXP

SQL> SELECT REGEXP_REPLACE('R4SX 315 GFX', 
    2      '([[:alnum:]]{4})([[:space:]]{1})([[:digit:]]{3})([[:space:]]{1})([[:alpha:]]{3})', 
    3      '\1\2\3\5') 
    4 FROM DUAL; 

REGEXP_REPL 
----------- 
R4SX 315GFX 

SQL> 

Если вы не уверены о количестве символов в каждом выражении образец, то вы могли бы сделать:

SQL> SELECT REGEXP_REPLACE('R4SX 315 GFX', 
    2      '([[:alnum:]]+[[:blank:]]+[[:digit:]]+)[[:blank:]]+([[:alpha:]]+)', 
    3      '\1\2') 
    4 FROM dual; 

REGEXP_REPL 
----------- 
R4SX 315GFX 

SQL> 

Использование SUBSTR и Instr

То же самое можно сделать с зиЬзЬгами и инстр, которые меньше ресурсов станут назначенными потребляющими, чем регулярное выражение.

SQL> WITH DATA AS 
    2 (SELECT 'R4SX 315 GFX' str FROM DUAL 
    3 ) 
    4 SELECT SUBSTR(str, 1, instr(str, ' ', 1, 2) -1) 
    5 ||SUBSTR(str, instr(str, ' ', 1, 2)  +1, LENGTH(str)-instr(str, ' ', 1, 2)) new_str 
    6 FROM DATA; 

NEW_STR 
----------- 
R4SX 315GFX 

SQL> 
+0

Большое спасибо @LalitKumarB. Это работает как шарм. – Asela

+0

@Asela Добро пожаловать! Я добавил еще один пример, используя 'SUBSTR' и' INSTR'. –

2

В вашем регулярном выражении указан недопустимый класс alphanum. Кроме того, эти классы должны использоваться внутри классов символов [...]. Вместо \s вам необходимо использовать поддерживаемый класс [:blank:]. Более подробную информацию о синтаксисе regex в MySQL можно найти here.

Я рекомендую использовать

SELECT REGEXP_REPLACE(
'R4SX 315 GFX', 
'([[:alnum:]]+[[:blank:]]+[[:digit:]]+)[[:blank:]]+([[:alpha:]]+)' 
, '\1\2') "REGEXP_REPLACE" 
FROM dual; 

Таким образом, вы будете использовать только 2 захватив группы. Чем меньше у нас, тем лучше. Здесь вы можете увидеть более подробную информацию о REGEXP_REPLACE function.

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

  • Нет связанных вопросов^_^