Ruby 除非允许,否则替换所有URL

Ruby 除非允许,否则替换所有URL,ruby,regex,gsub,Ruby,Regex,Gsub,我有一个正则表达式,它替换了给定字符串中的所有URL: my_string = "www.example.com test www.mysite.com" my_string.gsub!(/[a-zA-Z0-9\-\.]+\.(com|net|de|org|uk|biz|info|co.uk|es|de)(\/\S*)?/i,'(site hidden)') 由于上述原因,我得到:(站点隐藏)测试(站点隐藏) 如何更改regex以不替换www.mysite.com 这意味着替换应该输出(站点隐

我有一个正则表达式,它替换了给定字符串中的所有URL:

my_string = "www.example.com test www.mysite.com"
my_string.gsub!(/[a-zA-Z0-9\-\.]+\.(com|net|de|org|uk|biz|info|co.uk|es|de)(\/\S*)?/i,'(site hidden)')
由于上述原因,我得到:(站点隐藏)测试(站点隐藏)

如何更改regex以不替换www.mysite.com

这意味着替换应该输出(站点隐藏)测试www.mysite.com“

谢谢

蛮力怎么样?:)

见暴力如何?:)


请参见如果原始文本在允许的条目列表中,则可以使用块生成替换:

my_string = "www.example.com test www.mysite.com"
allowed = %w(www.mysite.com)
re = %r/[a-zA-Z0-9\-\.]+\.(com|net|de|org|uk|biz|info|co.uk|es|de)(\/\S*)?/i
my_string.gsub!(re) do
  |m| allowed.include?(m) ? m : '(site hidden)'
end
puts my_string

如果原始文本在允许的条目列表中,则可以使用块生成替换:

my_string = "www.example.com test www.mysite.com"
allowed = %w(www.mysite.com)
re = %r/[a-zA-Z0-9\-\.]+\.(com|net|de|org|uk|biz|info|co.uk|es|de)(\/\S*)?/i
my_string.gsub!(re) do
  |m| allowed.include?(m) ? m : '(site hidden)'
end
puts my_string

(?!…)
(无匹配组)怎么样?我看到你的正则表达式了。这是你在这里创建的某种特别列表,还是打算更彻底一些?@tadman,这是特别的,谢谢你的提问。
(?!…)
(无匹配组)怎么样?我看到你的正则表达式了。这是你在这里创建的某种特别列表,还是打算更彻底?@tadman,这是特别的,谢谢你的提问。这种模式应该有一个聪明的名字。我以前不得不这么做,经常用一些糟糕的东西,比如
\0
来表示它。这个模式应该有一个聪明的名字。我以前不得不这样做,经常使用一些可怕的东西,比如
\0
来表示它。
gsub
加上一个块是强大的盟友。如果
allowed
是一个散列,以避免随着列表的增长替换时间的几何增长,那么这将更好
hash=hash[array.collect{| v |[v,true]}]
是一种快速转换它的方法。@tadman使用hash确实是一个好主意,如果允许有大量固定字符串的列表。但我怀疑一个真正的实现需要一个或多个regexp来允许大量URL。
gsub
加上一个块是强大的盟友。如果
allowed
是一个散列,以避免随着列表的增长替换时间的几何增长,那么这将更好
hash=hash[array.collect{| v |[v,true]}]
是一种快速转换它的方法。@tadman使用hash确实是一个好主意,如果允许有大量固定字符串的列表。但我怀疑一个真正的实现需要一个或多个regexp来允许大量的URL。