2013-04-05 20 views
16

iRuby regex- gsub eşleşmesini saklıyor mu?

.gsub(/matchthisregex/,"replace_with_this") 

bir yere regex ile eşleşir neyi saklamak gsub yapar kullanırsanız? Yedek dizimde ne eşleştiğini kullanmak istiyorum. Benim yukarıdaki örnekte

"replace_with_" + matchedregexstring + "this" 

gibi örnek bir şey için matchedregexstring gsub depolanan maç nerede olacağını? Maalesef bu kafa karıştırıcı olsaydı, bunu başka nasıl söyleyeceğimi bilmiyorum. fine manual itibaren

cevap

29

: bir String olduğunu

yedek Eğer eşleşti metin için değiştirilir. d'un bir grup numarası olduğu \d biçimindeki örüntüsünün yakalama grupları için arka referanslar içerebilir veya n bir grup adıdır. Çift tırnaklı bir dizgeyse, her iki arka referans da ek bir ters eğik çizgi ile yapılmalıdır. Ancak, yedek içinde, &$ gibi özel eşleşme değişkenleri geçerli eşleşmeyi göstermez.
[...] bir blok formunda
, mevcut eşleşme dizisidir bir parametre olarak geçirilir ve değişkenleri, $1, $2, $ ', $& ve $' olarak uygun ayarlanacaktır. Her çağrıdaki eşleşme için blok tarafından döndürülen değer değiştirilir.

Eğer yakalama gruplar umurumda değil (yani regex (expr) gibi şeyler) o zaman blok formu ve $& kullanabilirsiniz olmadıysa yakalama grupları yapabilirsiniz zorunda mıyım

>> 'where is pancakes house?'.gsub(/is/) { "-#{$&}-" } 
=> "where -is- pancakes house?" 

yedek dizesindeki \n kullanın:

>> 'where is pancakes house?'.gsub(/(is)/, '-\1-') 
=> "where -is- pancakes house?" 

veya $n blokta:

Eğer tüm maçları oturum açmak istiyorsanız

my_string.gsub(my_regexp){ Regexp.last_match.inspect } 

, bunu daha pratik bir örnek vermek gerekirse:

>> 'where is pancakes house?'.gsub(/(is)/) { "-#{$1}-" } 
=> "where -is- pancakes house?" 
+0

Aha! - Yani, dokümanlardaki ekstra '\', Rdoc’un sadece eserleridir. Kafamı kastettiğimi anlamaya çalışıyorum. – matt

+0

@matt: Ekstra ters eğik çizgileri kastediyorsunuz, değil mi? # * & # $ Markdown, $ -backtick değişkenime bu şekilde daha fazla eğlence için bakın :) Evet, çift tırnak kullanırsanız '\\ 1 'demeniz gerekir, ancak tek tırnak işaretleri kullanıyorsanız \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ İnterpolasyona ihtiyacım olmadığı sürece her zaman yaparım. –

+2

Evet, '' '' 'değil. Fark etmemiştim. Bence yorumlar bazen bir önizleme ile yapabilirdi. – matt

1

Ben gsub en maçları aslında böyle Regexp.last_match değişken (sınıfın MatchData) aracılığıyla erişilen olabileceği here öğrendim aşağıdaki gibi kullanılabilir:

"Hello world".gsub(/(\w+)/) { Regexp.last_match.captures.each{ |match| Rails.logger.info "FOUND: #{match}"} } 

#Rails log: 
FOUND: Hello 
FOUND: world 

özel durumda, böyle bir şey yapabileceğini:

mystring.gsub(/(matchthisregex)/){ mystring = "replace_with_#{Regexp.last_match[0].to_s}this"} 
3

Tüm ruby ​​sürümleri için: Eşleşen dizeyi almanın kolay yolu.

.gsub(/matched_sym/) {|sym| "-#{sym}-"}