2008-11-13 23 views
46

Ruby'de normal ifadeleri kullanırken, $ 1 ile \ 1 arasındaki fark nedir?

if "foobar" =~ /foo(.*)/ then 
    puts "The matching word was #{$1}" 
end 
:

"foobar".sub(/foo(.*)/, '\1\1') # => "barbar" 

$ 1 sonraki kodda kullanılabilecek bir küresel değişkendir:

cevap

78

\ 1

sadece aynı sub veya gsub yöntem çağrısında çalışacak bir geribaşvuru, örneğin bir

Çıkış:

"The matching word was bar" 
# => nil 
+0

[Ruby'nin tek tırnaklı çift tırnak muamelesi] (http://stackoverflow.com/a/3028799/303896), geri başvuruları kullanmaya çalışırken yolunuza girebileceğini unutmayın. – alxndr

+0

fazla anlamadı, birisi daha fazla açıklama sağlayabilir lütfen – YasirAzgar

+0

@YasirAzgar '.sub()' bir yöntem çağrısıdır. '' \ '' (Görünüşte) sadece bir 'sub' veya' gsub' yöntem çağrısı kapsamında kullanılabilir. İlk örnekte, "foobar" .sub (/ foo (. *) /, '\ 1 \ 1') ',' \ 1 ', 'sub' yönteminin kapsamındadır. İkinci örnekte, '$ 1'' sub'/'gsub' yönteminin dışında referans alınır. Örnek, bir '= ~' aramasından kısa bir süre sonra başvurduğunu gösterir, ancak bu konuyla alakasız. Görünüşe göre, bir regex'in kullanımı, global değişken olarak herhangi bir yere referans olarak verilebilecek olan '$ 1'. – John

29

Unutmayın ki üçüncü bir seçenek var, b sub'un kilit formu. Bazen buna ihtiyacın var. Bu metnin tersi ile bazı metni değiştirmek istediğinizi varsayalım. yeterince çabuk bağlı değil çünkü $ 1 kullanamazsınız:

"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1, 
            # or gives an error if $1 is unbound 

Ayrıca \1 kullanamazsınız sub yöntem sadece uygun yakalanan metin ile \1 basit bir metin ikame yapar, çünkü hiçbir sihir var burada yer alan:

"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof' 
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab' 
: Eğer fantezi bir şey yapmak istiyorsanız

"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\' 

Yani, sub blok formunu ($ 1, $ 2, $ `$,' vb mevcut olacak) kullanmalıdır

+1

Örneğiniz yanıltıcı olabilir - eşleşme, eşleşme gruplarına değil bloğa iletilir. Yani, "foobar" ı "foorab" olarak değiştirmek istemeniz durumunda, str.sub (/ (foo) (\ w +) /) {$ 1 + $ 2.reverse} ' – rampion

+1

ri koduna bakın. : Blok formunda, geçerli eşleme dizesi parametresi olarak geçirilir ve $ 1, $ 2, $ ', $ &, $ 'gibi değişkenler uygun şekilde ayarlanmış olacaktır. Bloğun döndürdüğü değer, her aramadaki eşleşme için olacaktır. – rampion

+0

Doğru, temizlemek için düzenleyeceğim. –