Oracle REGEXP_REPLACE 将中间的 space 替换为空字符串
Oracle REGEXP_REPLACE replace space in middle with empty string
我正在尝试使用 Oracle REGEXP_REPLACE
函数将白色 space(位于字符串中间)替换为空字符串。
我的一个专栏包含如下字符串。
- [字母数字][space][数字][space][alpha](例如
R4SX 315 GFX
)
现在,我只需要用空字符串(即 R4SX 315 GFX
--> R4SX 315GFX
)
为此,我尝试了以下代码:
SELECT REGEXP_REPLACE(
'R4SX 315 GFX',
'([:alphanum:])\s(\d)\s([:alpha:])',
' ') "REPLACED"
FROM dual;
但是,我得到的结果与我的输入相同(即 R4SX 315 GFX
)。
有人可以告诉我我做错了什么,请指出正确的方向。
提前致谢。
[:alphanum:]
alphanum
不正确。字母数字字符 class 是 [[: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 '')
4 FROM DUAL;
REGEXP_REPL
-----------
R4SX 315GFX
SQL>
如果您不确定模式的每个表达式中的字符数,那么您可以这样做:
SQL> SELECT REGEXP_REPLACE('R4SX 315 GFX',
2 '([[:alnum:]]+[[:blank:]]+[[:digit:]]+)[[:blank:]]+([[:alpha:]]+)',
3 '')
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>
您的正则表达式包含无效 class alphanum
。此外,这些 classes 必须在字符 classes [...]
内使用。您需要使用受支持的 [:blank:]
class 而不是 \s
。有关 MySQL 中正则表达式语法的更多详细信息,请参见 here.
我推荐使用
SELECT REGEXP_REPLACE(
'R4SX 315 GFX',
'([[:alnum:]]+[[:blank:]]+[[:digit:]]+)[[:blank:]]+([[:alpha:]]+)'
, '') "REGEXP_REPLACE"
FROM dual;
这样您将只使用 2 个捕获组。我们拥有的越少,性能越好。在这里您可以看到更多关于 REGEXP_REPLACE function.
的详细信息
我正在尝试使用 Oracle REGEXP_REPLACE
函数将白色 space(位于字符串中间)替换为空字符串。
我的一个专栏包含如下字符串。
- [字母数字][space][数字][space][alpha](例如
R4SX 315 GFX
)
现在,我只需要用空字符串(即 R4SX 315 GFX
--> R4SX 315GFX
)
为此,我尝试了以下代码:
SELECT REGEXP_REPLACE(
'R4SX 315 GFX',
'([:alphanum:])\s(\d)\s([:alpha:])',
' ') "REPLACED"
FROM dual;
但是,我得到的结果与我的输入相同(即 R4SX 315 GFX
)。
有人可以告诉我我做错了什么,请指出正确的方向。
提前致谢。
[:alphanum:]
alphanum
不正确。字母数字字符 class 是 [[: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 '')
4 FROM DUAL;
REGEXP_REPL
-----------
R4SX 315GFX
SQL>
如果您不确定模式的每个表达式中的字符数,那么您可以这样做:
SQL> SELECT REGEXP_REPLACE('R4SX 315 GFX',
2 '([[:alnum:]]+[[:blank:]]+[[:digit:]]+)[[:blank:]]+([[:alpha:]]+)',
3 '')
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>
您的正则表达式包含无效 class alphanum
。此外,这些 classes 必须在字符 classes [...]
内使用。您需要使用受支持的 [:blank:]
class 而不是 \s
。有关 MySQL 中正则表达式语法的更多详细信息,请参见 here.
我推荐使用
SELECT REGEXP_REPLACE(
'R4SX 315 GFX',
'([[:alnum:]]+[[:blank:]]+[[:digit:]]+)[[:blank:]]+([[:alpha:]]+)'
, '') "REGEXP_REPLACE"
FROM dual;
这样您将只使用 2 个捕获组。我们拥有的越少,性能越好。在这里您可以看到更多关于 REGEXP_REPLACE function.
的详细信息