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 23') "REPLACED" 
FROM dual;

然而,我得到的结果与我的输入(即R4SX 315 GFX)相同。有没有人能告诉我我做错了什么,并给我指出正确的方向。

[alphanum:]

alphanum是错误的。字母数字字符类为 [[:alnum:]]

可以在REGEXP_REPLACE中使用以下模式:

([[:alnum:]]{4})([[:space:]]{1})([[:digit:]]{3})([[:space:]]{1})([[:alpha:]]{3})
使用<<p> strong> REGEXP
SQL> SELECT REGEXP_REPLACE('R4SX 315 GFX',
  2                        '([[:alnum:]]{4})([[:space:]]{1})([[:digit:]]{3})([[:space:]]{1})([[:alpha:]]{3})',
  3                        '1235')
  4  FROM DUAL;
REGEXP_REPL
-----------
R4SX 315GFX
SQL>

如果您不确定模式的每个表达式中的字符数,那么您可以这样做:

SQL> SELECT REGEXP_REPLACE('R4SX 315 GFX',
  2                        '([[:alnum:]]+[[:blank:]]+[[:digit:]]+)[[:blank:]]+([[:alpha:]]+)',
  3                        '12')
  4  FROM dual;
REGEXP_REPL
-----------
R4SX 315GFX
SQL>
使用<<p> strong> 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>

您的正则表达式包含一个无效的类alphanum。此外,这些类必须在字符类[...]中使用。您需要使用受支持的[:blank:]类,而不是s。关于MySQL中正则表达式语法的更多细节可以在这里找到。

我推荐使用

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

这样您将只使用2个捕获组。我们拥有的越少对性能越好。在这里你可以看到REGEXP_REPLACE函数的更多细节

最新更新