【问题标题】:regex_replace doesn't replace the hyphen/dashregex_replace 不会替换连字符/破折号
【发布时间】:2012-04-16 14:00:59
【问题描述】:

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

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

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

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

有什么想法吗?

【问题讨论】:

  • 不应该是select regexp_replace(...)吧(from部分的replace函数真的没有意义)
  • 从末尾删除$ 会得到-,但是,我认为您需要它。如果您告诉我们您一般需要正则表达式做什么,可能会更好。

标签: regex postgresql


【解决方案1】:

您目前仅替换字符串末尾的非字母数字字符。我猜你的测试主要是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')

【讨论】:

  • 这似乎也删除了任何空格。有没有办法允许空格?
  • 当然,在字符类中添加空格即可。
  • 你需要regexp_replace('blink-182', '[^a-zA-Z0-9]+', '', 'g'),否则只会替换一个。
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2019-09-11
相关资源
最近更新 更多