regex_replace不替换连字符/破折号

时间:2012-04-16 14:00:59

标签: regex postgresql

我在postgreSQL中使用regex_replace并尝试去除字符串中不是字母或数字的任何字符。但是,使用这个正则表达式:

select * from regexp_replace('blink-182', '[^a-zA-Z0-9]*$', '')

返回'blink-182'。连字符没有被删除,并且没有像我期望的那样被替换为“'”。

如何修改此正则表达式以替换hypen - 我已经测试过许多其他字符(!,。#)并且它们都被正确替换。

有什么想法吗?

1 个答案:

答案 0 :(得分:11)

您目前只在字符串末尾替换的一组非字母数字字符。我猜您的测试主要是foobar!#形式的字符串,因为要删除的字符位于字符串的末尾。

要替换字符串中每个出现的此类字符,请从正则表达式中删除$

[^a-zA-Z0-9]+

(我也将*更改为+,以防止每个字符之间的零长度替换。

如果你想保留空格,你需要将它添加到字符类:

[^a-zA-Z0-9 ]+

或可能

[^a-zA-Z0-9\s]+

如果开头的正则表达式实际上是正确的,你只想删除字符串末尾的非字母数字字符,但想删除连字符中间的连字符一个字符串(同时保留字符串中间的其他非字母数字字符),那么以下内容应该有效:

[^a-zA-Z0-9]+$|-

maniek指出您需要向regexp_replace添加一个参数,以便它将替换多次匹配:

regexp_replace('blink-182', '[^a-zA-Z0-9]+$|-', '', 'g')