2013-06-24 80 views
2

我有一個帶有兩個單引號的字符串。即「女士的女士」轉義紅寶石串

我想逃避報價,所以我得到:「女士的女士」。

我曾嘗試以下:

> "lady's lady's".gsub("'", "\\'") 
=> "ladys lady'ss ladyss" 

> "lady's lady's".gsub("'", "\\\\'") 
=> "lady\\'s lady\\'s" 

> "lady's lady's".gsub("'", "\'") 
=> "lady's lady's" 

任何幫助嗎?

+2

「'\」 「'等於'''」',所以我覺得'''女士\''''''可能是你想要的。但是'irb'或者'pry'可以以僥倖的方式打印出來。 – Jokester

回答

3
"lady's lady's".gsub("'", "\\\\'") # => "lady\\'s lady\\'s" 

正如@Neil提到見下圖:

"lady's lady's".gsub(/'/, "\\\\\'").chars.to_a 
# => ["l", 
#  "a", 
#  "d", 
#  "y", 
#  "\\", 
#  "'", 
#  "s", 
#  " ", 
#  "l", 
#  "a", 
#  "d", 
#  "y", 
#  "\\", 
#  "'", 
#  "s"] 
+0

這不是我要找的。它有雙「\」 – Tony

+0

我在尋找:「女士的女士」。 – Tony

+2

@Tony:''lady's lady's「.gsub(/'/,」\\\\'「).chars.to_a'表示顯示的雙精度\\'只是irb中的一個假象。這是我認爲的正確答案! –

5

經典,需要進行轉義字符都是非字母數字。例如,Perl的quotemeta可以轉義所有不是數字,字母或下劃線的東西。

您可以通過使用gsub複製此行爲:

str = "lady's lady's" 

puts str.gsub(/(?=\W)/, '\\') 

輸出

lady\'s\ lady\'s 

如果你特別不希望任何東西,但撇號,然後逃離正則表達式是簡單的改變,用(?=')代替(?=\W)


注意

結果

> "lady's lady's".gsub("'", "\\'") 
=> "ladys lady'ss ladyss" 

是因爲使用的«\'»文字替換字符串替換全局變量$'的值的每個撇號 - 比賽結束後的字符串。

因此,第一個撇號被替換爲«s lady's»,第二個替換爲«s»,導致奇怪的«ladys lady'ss ladyss»

你必須使用的«\\'»文字替換字符串只«\'»

它更整潔使用前瞻和避免更換撇號來代替:

+0

我認爲這個正則表達式更容易處理。另外,您對「女士女士女士」結果的解釋值得加入IMO的解答。 –

+0

@NeilSlater我應該刪除我的帖子嗎? –

+0

@NeilSlater:好的電話。完成。 – Borodin