带正则表达式的gsub删除一个字符

时间:2013-01-31 11:59:48

标签: ruby-on-rails ruby regex ruby-on-rails-3 gsub

我有一篇文章模型(article.rb):

class Article < ActiveRecord::Base
  attr_accessible :name, :content
end

我的文章中有gsub这样的内容.rb:

self.content.gsub!(/anylink[^']/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>")

这会使用"anylink"替换文章文本中的"link_to 'anylink', 'http://website.com/anylink'"一词来创建自动链接。当已经有"link_to..."时,它不会被替换,因为我在正则表达式中的任何链接之后排除了'

它有效,但问题是它会删除"anylink"之后的下一个字符。例如。它会转换:

"Have a look at anylink and see"

"Have a look at anylinkand see"
第二个短语中的

"anylink"现在是一个超链接,所以一切都很好,除了在gsub操作期间删除的缺失空间。任何想法为什么以及如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

String#gsub将替换您的模式的整个匹配部分替换为anylink字符串一个不是撇号的字符。

所以它会替换以下字符串,例如:

  • anylinkA
  • anylink.
  • anylink!

如果你想保留你的角色,你可以创建一个匹配并在替换后放置它:

self.content.gsub!(/anylink([^'])/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>\\1")

此处匹配组([^'])将匹配该字符,转义\1将在您替换后放置该字符。

但我建议您使用\b来匹配word boundary

self.content.gsub!(/\banylink\b/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>")

因此,使用此解决方案,anylink一词将被gsub替换,并且可以在任何字符之前或之后,但不能使用字母数字。

如果您要替换self.content中的所有匹配项,请添加g regexp修饰符:

self.content.gsub!(/\banylink\b/ig, "<%= link_to 'anylink', 'http://website.com/anylink' %>")