2013-01-31 51 views
0

我有一篇文章模型(article.rb):GSUB正則表達式刪除一個字符

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

我有一個gsub像這樣在我article.rb:

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

這替代了字"anylink"在文章的文章中用"link_to 'anylink', 'http://website.com/anylink'"創建一個自動鏈接。當已經有一個"link_to..."時,它不會替代,因爲我在正則表達式的anylink之後排除了'

它可以工作,但問題是它會刪除"anylink"後面的下一個字符。例如。它轉換:

"Have a look at anylink and see" 

"Have a look at anylinkand see" 

"anylink"在這個二期現在是一個超鏈接,所以一切都只是有gsub操作過程中刪除了丟失的空間罰款。任何想法爲什麼以及如何避免這種情況?

回答

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正則表達式修改:

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

感謝。我沒有完全理解第一個解決方案,在行尾添加\\ 1並沒有改變行爲。我第一次編輯文章時,第二個建議正常,但第二次它將「link_to'anylink','http ...'替換爲'link_to'link_to'anylink',http ...',http ......「。這就是爲什麼我排除了gsub的執行,如果這個詞的末尾有一個'gsub!(/ anylink([^'])/ i等等......) – user929062

+0

你沒有提到你在內容上多次運行替換。如果你這樣做,它會每次替換'anylink'字符串。所以鏈接裏面會有鏈接。 –

+0

是的,抱歉沒有提到它。這就是爲什麼我有/ anylink([^'])/正則表達式原則上解決了這個問題。正如我所說,它也只是刪除了背後的角色,這是主要問題。 – user929062