2011-11-15 21 views
8

başvurur.Yakut dize alt sırt ben Ruby basit bir dize alt yapmaya çalışıyorum

alt ikinci argüman() içerdiği normal ifadeler vardır minified JavaScript uzun parçasıdır. Bu dizgedeki regex'deki geri referanslar alt sonucunu etkiliyor gibi görünmektedir, çünkü değiştirilen dize (yani, ilk argüman) çıktı dizesinde görünmektedir.

Örnek:

input = "string <!--tooreplace--> is here" 
output = input.sub("<!--tooreplace-->", "\&") 

Ben çıkış olmak istiyorum:

"string \& is here" 

Değil:

"string & is here" 

veya eğer

regex

"string <!--tooreplace--> is here" 
kaçan

Temelde, hiç düzenli ifade sonuçlar doğurur bir dize alt yapmanın bir yolunu istiyoruz - sadece basit bir dize değiştirin.

+0

sorunu gösteren küçük bir örnek oluşturabilir miyim? –

+0

Örnek kod eklendi. –

cevap

2

Kullanım tek tırnak ve ters eğik çizgi kaçış:

output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here" 
6

, yedek dizesi kaçmayı Regex.escape nasıl kullanılacağını anlamaya zorunda kalmamak için. Değiştirmeler karmaşık olduğunda veya onunla uğraşmak gereksiz bir acı olduğunda kullanışlıdır. String'de küçük bir yardımcı da güzel.

input.sub("<!--toreplace-->", Regexp.escape('\&')) 
+2

Bu, örneğin düzeltir, ancak başka bir yerde sorunlara neden oluyor gibi görünüyor. Örneğin, 2. argümanı '\ &, O =/\ s * ([\ s \ + \ ~>]) \ s */g' olarak değiştirirseniz, çıktı 'string \ &, O =/\ gibi görünür. s \ * \ (\ [\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 'burada \' \ '\ \ \ \ \ \ \ \ \ \ \ burada \' \ \ \ \ \ \ \ \ \ \ \ \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ z \ n \ z \ n \ z. –

3
Ayrıca (Regexp.escape aksine) daha basit hale getirmek için blok gösterimi kullanabilirsiniz

:

=> puts input.sub("<!--tooreplace-->") {'\&'} 
string \& is here 
+0

İnanılmaz derecede yararlı - özellikle başka kullanımlara (örneğin, bir dosyayı okumak ve dosya içeriklerini değiştirme dizesi olarak kullanmak) uygulayacağınız için, bu seçenek kaçamak değildir. –

0

Kuyusu (yani & ardından \ olduğu) şeklinde yorumlanır ediliyor '\\&' beri özel bir ifade ifadesi, ters eğik çizgi kaçmak için gerekçe anlamına gelir. Aslında, bu çalışır: \\\\& literal dize \\& temsil

>> puts 'abc'.sub 'b', '\\\\&' 
a\&c 

Not söyledi.