Bir dizeyi normal ifadeye enterpolasyonlama


160

Ruby benim normal ifade içine bir dize değerini yerine gerekir. Bunu yapmanın kolay bir yolu var mı? Örneğin:

foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 
if goo =~ /value of foo here dynamically/
  puts "success!"
end

Foo'nun bir goo'nun alt dizisi olup olmadığını görmeye mi çalışıyorsunuz? Ne istediğini bilmiyorum.
Neall

Eğer öyleyse, goo.include? (Foo) yeter!
glenn mcdonald

1
Hayır, foo'nun goo'nun bir alt dizisi olup olmadığını görmeye çalışmıyordum; Ben de bazı yakalama yapmak gerekiyordu, bu nedenle dahil işe yaramadı.
Chris Bunch

Yanıtlar:



125

Not Regexp.quoteyılında Jon L. cevabı önemlidir!

if goo =~ /#{Regexp.quote(foo)}/

Sadece "açık" sürümü yaparsanız:

if goo =~ /#{foo}/

eşleşme metninizdeki dönemler normal ifade joker karakterleri olarak değerlendirilir ve "0.0.0.0"eşleşir "0a0b0c0".

Ayrıca, yalnızca bir alt dize eşleşmesini gerçekten kontrol etmek istiyorsanız,

if goo.include?(foo)

özel karakterler için ek bir alıntı veya endişe gerektirmez.


3
.quote()Bir dize kullanarak bir normal ifade oluşturmak istiyorsanız , bunun tersinin (kullanılmıyor ) da yararlı olabileceğini unutmayın.
Jesse

"Bir alt dize eşleşmesini gerçekten kontrol etmek istiyorsanız, bunu yapabilirsiniz if goo.include?(foo)" => Varlığını kontrol etmek istediğinizde True. String.gsub'ı değiştirmek ve zaten kullanmakla ilgileniyorsanız, Regexp.quote tek seçeneğiniz olabilir.
Isaac Betesh

Sadece bu aracı sadece kaçan gerek yok karakter dizesini geçen durumunda Jesse'ye belli değil mi eklemek için Regexp.newya Regexp.compile.
dylankb

Regexp.quote'u neden kullanmak isteyebileceğimizin yararlı açıklaması için teşekkür ederiz
Wylliam Judd

7

Muhtemelen Regexp.escape(foo)bir başlangıç ​​noktası olurdu, ancak daha geleneksel ifade enterpolasyonunu kullanamamanızın iyi bir nedeni var "my stuff #{mysubstitutionvariable}"mı?

Ayrıca, !goo.match(foo).nil?değişmez bir dize ile de kullanabilirsiniz .



3

Regexp.new kullanın:

if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/

3

İşte sınırlı ama kullanışlı başka bir cevap:

Ben sadece benim giriş dizesinde tek tırnak kullandı: Regexp.quote veya Regexp.escape kullanmadan kolayca bir regex ekleyebilirsiniz ki keşfetti: (bir IP adresi eşleştirme)

IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key 
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0") 
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"

tek tırnak sadece \\ ve \ 'yorumlamak.

http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes

Bir regex aynı uzun bölümünü birkaç kez kullanmanız gerektiğinde bu bana yardımcı oldu. Evrensel değil, ama soru örneğine uyuyor inanıyorum.


Buradaki görevim hakkında ne düşünüleceğini merak ediyorum, ancak şimdiye kadar burada göreceğinden şüpheliyim.
Plasmarob

-2
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/

2
Hayır, bu hatalı bir "doğru" verecektir "burada" 070x0! 0 "gibi başka şeyler de vardır, çünkü noktalar normal ifade joker karakteridir.
glenn mcdonald
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.