Oracle REGEXP_REPLACE用空字符串替换中间的空格

时间:2015-05-27 10:20:18

标签: regex string oracle regexp-replace

我尝试使用Oracle REGEXP_REPLACE函数用空字符串替换空格(位于字符串中间)。

我的一个列包含如下字符串。

  • [alphanumeric] [space] [digits] [space] [alpha] (例如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)。 有人可以告诉我我做错了什么,请指出我正确的方向。

提前致谢。

2 个答案:

答案 0 :(得分:2)

  

[:alphanum:]

alphanum不正确。字母数字字符类是 [[: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

使用substr和instr也可以做到这一点,这比regexp消耗更少的资源。

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>

答案 1 :(得分: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的详细信息。