2009-04-04 6 views

Répondre

1

Votre problème est que la chaîne "\" est significative pour gsub dans une chaîne de remplacement. Afin de le faire fonctionner comme vous le souhaitez, vous devez utiliser le formulaire de bloc.

s.gsub("'") {"\\'"} 
4
>> puts s.gsub("'", "\\\\'") 
children\'s world 
+1

Il devient le monde des enfants. – Jirapong

+0

Non, ce n'est pas le cas. – Magnar

+5

@Jirapong La raison pour laquelle vous pensez que ça se passe est parce que la console des rails n'affiche pas la chaîne, mais affiche comment on pourrait construire la chaîne. Donc, si vous entrez "\\", l'événement "\\" s'affichera bien qu'il s'agisse d'une chaîne avec une seule barre oblique inverse. Pour découvrir ce qui est vraiment dans la chaîne, vous devez utiliser ** puts **. Par exemple, "\\" affiche un seul antislash. – Brian

11

de ruby-doc.org sur le modèle de remplacement pour gsub:

les séquences \ 1, \ 2, et ainsi de suite peuvent être utilisés pour interpoler des groupes successifs lors de la rencontre

Ceci inclut la séquence \', qui signifie "tout ce qui suit ce que j'ai apparié".

Soit "\\'" ou '\\\'' sera à la fois produire \' (rappelez-vous que \ doit être échappé dans les deux doubles et chaînes entre guillemets simples, et que ' doit être échappé dans les chaînes entre guillemets simples, donc en utilisant les guillemets simples dans cette cas fait réellement les choses plus verbose). .: par exemple

puts "before*after".gsub("*", "\\'") 
"beforeafterafter" 

puts "before*after".gsub("*", '\\\'') 
"beforeafterafter" 

Qu'est-ce que vous voulez gsub voir est alors en fait \\', qui peut être produit à la fois par "\\\\'" et '\\\\\''. Alors:

puts s.gsub("'", "\\\\'") 
children\'s world 

puts s.gsub("'", '\\\\\'') 
children\'s world 

ou si vous avez à faire beaucoup avec \ vous pourriez profiter du fait que lorsque vous utilisez /.../ (ou %r{...}) vous n'avez pas de double-les backslashs:

puts s.gsub("'", /\\'/.source) 
children\'s world 
Questions connexes