2015-05-27 108 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的更多细节。