2015-05-27 155 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> 

使用SUBSTRINSTR

同樣可以用SUBSTR和INSTR這wouldbe少消耗資源比正則表達式來完成。

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:]類。有關MySQL中正則表達式語法的更多細節可以參見here

我建議使用

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

這樣,您將只使用2捕獲組。我們做得越好,表現越好。在這裏你可以看到REGEXP_REPLACE function的更多細節。