regex_replace不替换连字符/破折号

regex_replace不替换连字符/破折号,regex,postgresql,Regex,Postgresql,我在postgreSQL中使用regex_replace,并试图去掉字符串中任何不是字母或数字的字符。但是,使用此正则表达式: select * from regexp_replace('blink-182', '[^a-zA-Z0-9]*$', '') 返回“blink-182”。连字符并没有像我预期的那样被删除和替换 我如何修改这个正则表达式来替换hypen?我已经用很多其他字符测试过了!,。它们都被正确地更换了 有什么想法吗?您当前只替换字符串末尾的一系列非字母数字字符。我猜你们的测试主

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

select * from regexp_replace('blink-182', '[^a-zA-Z0-9]*$', '')
返回“blink-182”。连字符并没有像我预期的那样被删除和替换

我如何修改这个正则表达式来替换hypen?我已经用很多其他字符测试过了!,。它们都被正确地更换了


有什么想法吗?

您当前只替换字符串末尾的一系列非字母数字字符。我猜你们的测试主要是foobar格式的字符串!这是因为要删除的字符位于字符串的末尾

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

[^a-zA-Z0-9]+
我还将*改为+以防止每个字符之间的零长度替换

如果还希望保留空白,则需要将其添加到字符类:

[^a-zA-Z0-9 ]+
或者可能

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

如果一开始的正则表达式实际上是正确的,因为你只想从字符串的结尾去除非字母数字字符,但是你也希望在字符串中间去掉连字符,同时在字符串中间保留其他非字母数字字符,那么下面的工作应该是:

[^a-zA-Z0-9]+$|-
指出您需要向regexp_replace添加一个参数,以便它将替换多个匹配项:

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

这似乎也删除了任何空白。是否有允许空白的方法?当然,只需在字符类中添加空白。您需要regexp_替换'blink-182'、“[^a-zA-Z0-9]+'、'g',否则只进行一次替换。是否应该选择regexp_替换。。。相反,from部分中的replace函数并没有真正意义上的意义,从末尾删除$将拾取-,但是,我认为您需要这样做。如果你告诉我们你需要正则表达式做什么,可能会更好。