为啥在使用 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
为啥微信编辑时鼠标选中一个字,而且打字时会自动删除后面的字?