regex_replace不替换连字符/破折号

har*_*don 2 regex postgresql

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

select * from regexp_replace('blink-182', '[^a-zA-Z0-9]*$', '')
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?

Joe*_*oey 11

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

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

[^a-zA-Z0-9]+
Run Code Online (Sandbox Code Playgroud)

(我也将其*改为a +以防止每个角色之间的零长度替换.

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

[^a-zA-Z0-9 ]+
Run Code Online (Sandbox Code Playgroud)

或者可能

[^a-zA-Z0-9\s]+
Run Code Online (Sandbox Code Playgroud)

如果在一开始的正则表达式实际上纠正,你只想从字符串末尾除去非字母数字字符,但你想删除连字符,减去一个字符串中间(同时保留其他非字母数字字符在字符串的中间),然后以下应该工作:

[^a-zA-Z0-9]+$|-
Run Code Online (Sandbox Code Playgroud)

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

regexp_replace('blink-182', '[^a-zA-Z0-9]+$|-', '', 'g')
Run Code Online (Sandbox Code Playgroud)

  • 当然,只需在角色类中添加空格即可. (2认同)