Değişken adı kullanan Ruby normal ifadesi


105

Ruby'de bir değişken adının değerini esas alan bir düzenli ifade kalıbı yaratmak / kullanmak mümkün müdür?

Örneğin, Ruby dizeleri ile aşağıdakileri yapabileceğimizi hepimiz biliyoruz:

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

Aynı şeyi normal ifadelerle yapmak istiyorum:

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

Açıkçası bu listelendiği gibi çalışmıyor, sadece ne yapmak istediğimi göstermek için oraya bir örnek olarak koydum. Bir değişkenin içeriğinin değerine göre regexp eşleşmesine ihtiyacım var.

Yanıtlar:


184

Çalışmadığını düşündüğünüz kod:

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

Var, düzenli ifade meta karakterleri içerebiliyorsa işler daha ilginç hale gelir. Eğer öyleyse ve bu matakarakterlerin normal ifadede genellikle yaptıkları şeyi yapmasını istiyorsanız, aynı gsub çalışacaktır:

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

Arama dizesi meta içeriyorsa ve eğer Ancak, değil onları meta karakterler olarak yorumlanır istiyorum, sonra böyle Regexp.escape kullanın:

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

Veya gsub'a normal ifade yerine bir dize verin. MRI> = 1.8.7'de, gsub bir dize değiştirme bağımsız değişkenini normal bir ifade olarak değil, düz bir dize olarak ele alır:

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

(Eskiden gsub için bir dize değiştirme bağımsız değişkeni otomatik olarak normal ifadeye dönüştürülüyordu. 1.6'da bunun böyle olduğunu biliyorum. Değişikliği hangi sürümün başlattığını hatırlamıyorum).

Diğer yanıtlarda belirtildiği gibi, enterpolasyona alternatif olarak Regexp.new'i kullanabilirsiniz:

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

4
Regexp.escape'teki ipucu, ihtiyacım olduğunu bilmediğim şeydi. Teşekkürler!
Jeff Paquette

regxPlayerVariable = '(. *?) =. *? document \ .getElementById (# {pluginPlayeVariable})' buna hepsini uyguladım ama bunlar çalışmıyor.
SSP

1
@SSP Sorunu ayrı bir soru ile açıklamak iyi olabilir.
Wayne Conrad

13

Çalışır, ancak gsub!dönüşü başka bir değişkene kullanmanız veya atamanız gerekir

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str


6

Ruby'de değişkenler aracılığıyla normal ifadeler kullanabilirsiniz:

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

1
Bunun neden sadece olumsuz oylar aldığından emin değilim. Hem vardeğişkende hem de gsub'un ilk parametresinde normal ifade eğik çizgilerine ihtiyacınız olmasa bile denedim ve çalışıyor .
Tyler Collier

Bence gsub'daki eğik çizgilerin amacı, bir normal ifadenin kendisi bir normal ifade olan bir değişken içerebileceğini göstermekti. Değişkenin dize türü olması gerekmez (ve aslında, normal ifade Wayne'in cevabında belirtilen nedenlerden dolayı daha iyidir).
mahemoff

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.