为啥在使用 regexp_replace 时每个字符前后都有空格?

Posted

技术标签:

【中文标题】为啥在使用 regexp_replace 时每个字符前后都有空格?【英文标题】:Why am I getting white spaces before and after every single character when using regexp_replace?为什么在使用 regexp_replace 时每个字符前后都有空格? 【发布时间】:2018-01-31 15:51:54 【问题描述】:

我正在尝试用空格 (' ') 替换所有特殊符号。

到目前为止,我所拥有的是:

select regexp_replace(column_name, '-|"|~|!|(|)|-', ' ') from tablename;

开始 COLUMN_NAME : He!lo 我最终得到了什么:H e l o

我做错了什么?提前致谢!

【问题讨论】:

您的预期结果是什么?也许用 '' 代替 '' 尝试如下:["|~|!|(|)|-] 你不用这么多|,做一套[-"~!()]就行了 【参考方案1】:

您的问题是 |(|)| 括号测试。括号是正则表达式中的一个特殊字符,因此您实际上是在测试(|),它只是捕获每个字符(管道在这里什么都不做)。

例如,您正在捕获字符“H”,然后将捕获替换为捕获H 和空格' '。这也意味着在此测试之后出现的任何字符(您的连字符)都不会被替换,因为它已经被捕获。

据说更好的方法是:

REGEXP_REPLACE(COLUMN_NAME, '[^0-9a-zA-Z]', ' ')

括号中的插入符号表示“如果找到不在这些范围内的字符”

或者,您要测试的字符列表是有限的,那么:

REGEXP_REPLACE(COLUMN_NAME, '["~!\(\)]', ' ')

特别注意用反斜杠转义列表中的正则表达式特殊字符。 Here's a good resource for identifying special characters

有 12 个具有特殊含义的字符:反斜杠 \、 插入符号 ^、美元符号 $、句点或点 .、竖线或 管道符号 |、问号 ?、星号或星号 *、加号 符号+,左括号(,右括号), 左方括号 [ 和左大括号 ,

【讨论】:

!-\( 在您的正则表达式中创建一个范围。 @ctwheels 该死!我会修复的。正则表达式中的非 ALNUM 字符列表必须是反模式。 您也可以将[\W_] 用于非字母数字字符 在一个字符类(括号表达式)中只有三个具有特殊含义的字符:插入符号(不是“克拉”!)、破折号和右方括号。此外,它们无法逃脱——它们必须放置在没有特殊意义的地方。【参考方案2】:

或者你可以使用这个:

select regexp_replace(column_name, '[^[:alpha:][:digit:]]+', '')  from tablename;

或 更简洁

select regexp_replace(column_name, '[^[:alnum:]]', '')  from tablename;

正如@ctwheels 建议的那样。

D e m o

【讨论】:

您可以将[^[:alpha:][:digit:]]+ 简化为[^[:alnum:]]【参考方案3】:

转义元字符()

regexp_replace(column_name, '-|"|~|!|\(|\)|-', ' ')

【讨论】:

以上是关于为啥在使用 regexp_replace 时每个字符前后都有空格?的主要内容,如果未能解决你的问题,请参考以下文章

想更改为每个单词的结尾而不是字符串的结尾(匹配) - MariaDB/MySQL + REGEXP_REPLACE

使用 regexp_replace 命令时遇到问题

为啥微信编辑时鼠标选中一个字,而且打字时会自动删除后面的字?

regexp_replace 和 regexp_substr 变量的比较

为啥我的AE打不了字啊

如何 REGEXP_REPLACE 特殊字符