4

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

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

返回“眨眼 182”。正如我所料,连字符没有被删除并替换为空('')。

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

有任何想法吗?

4

1 回答 1

12

您当前仅替换字符串末尾的一连串非字母数字字符。我猜您的测试主要是foobar!#有效的形式的字符串,因为要删除的字符位于字符串的末尾。

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

[^a-zA-Z0-9]+

(我也将其更改*为 a+以防止在每个字符之间进行零长度替换。

如果您还想保留空格,则需要将其添加到字符类中:

[^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')
于 2012-04-16T14:02:44.320 回答