SORU
15 ŞUBAT 2010, PAZARTESİ


Ruby düzenli ifade kullanarak değişken adı

/Kullanım değişken bir değeri temel alan ruby düzenli ifade deseni oluşturmak mümkün mü?

Örneğin, hepimiz Ruby dizeler aşağıdaki yapabiliriz:

str = "my string"
str2 = "This is #{str}" # => "This is my string"

Düzenli ifadeler ile aynı şeyi yapmak istiyorum:

var = "Value"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "a test foo"

Belli ki bu listelendiği gibi, ben sadece bunu yapmak istiyorum ne göstermek için bir örnek olarak çalışmıyor. Maç regexp için bir değişken içeriğinin değerine bağlı ihtiyacım var.

CEVAP
15 ŞUBAT 2010, PAZARTESİ


Sence bu kod işe yaramadı değil:

var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' )   # => "a test foo"

Şey, eğer var normal ifade meta-karakter içerebilir eğer daha ilginç olsun. Ve bu matacharacters genellikle normal ifadede ne yapmak istiyorsanız, o zaman aynı gsub çalışır:

var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"

Eğer arama dize boşluk içeriyorsa, ancak, senin için önemlideğilmeta karakterler olarak yorumlanır istiyorum, Regexp kullanın.böyle kaçış:

var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"

Ya da sadece gsub normal bir ifade yerine bir dize ver. MR >= 1.8.7, gsub düz bir dize, düzenli ifade olarak dize yerine bir argüman kabul:

var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"

(Gsub için dize yerine bir değişken otomatik olarak bir düzenli ifade için dönüştürülmüş olabilir. 1.6 bu şekilde olduğunu biliyorum. Değişim) piyasaya hatırlamıyorum.

Diğer yanıtlar belirtildiği gibi, Regexp kullanabilirsiniz.alternatif olarak yeni aradeğerleme için:

var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrea Lewis

    Andrea Lewis

    14 Mart 2013
  • DeAdPiXel6667

    DeAdPiXel666

    2 Ocak 2010
  • John Lynn

    John Lynn

    8 Ocak 2010