Ruby

2012-03-29 25 views
17

'de dinamik bir düzenli ifade oluşturmak mümkün mü? Bir web sayfasında hrefs'leri ilerletmek için aşağıdaki normal ifadeyi kullanıyorum.Ruby

\/static\/workout\/[A-Z]{1,4}032812[A-Z]{1,5}-EQB.html 

Ben değeri geçerli tarih yansıtacak şekilde, normal ifadenin 032.812 kısmı dinamik hale getirmek için bir yol bulmak istiyoruz. Bir dize

a = \/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html 

ve sonra

\ a \ 

oluşturma çalıştı ancak bu işe yaramadı

\/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html 

: gibi örneğin Fore, 31 Mart 2012 tarihinde düzenli ifade görünürdü. Bunu yapmanın bir yolu var mı.

cevap

52

#{}'u bir dizede olduğu gibi kullanabilirsiniz.

1.9.2p290 :001 > some_string = "033112" 
=> "033112" 
1.9.2p290 :002 > a_regex = /[A-Z]{1,4}#{some_string}[A-Z]{1-5}-EQB.html/ 
=> /[A-Z]{1,4}033112[A-Z]{1-5}-EQB.html/ 
+0

Teşekkür! Bunu anlamak için kendimi tekmeliyorum. tekrar teşekkürler, yardımınız için teşekkür ederiz. – Mutuelinvestor

+0

Ruby 2.2.0'da çalışıyor mu? – MC2DX

+1

@ MateuszCzerwiński Bu, Ruby 2.2'de çalışır, ancak değişken normal ifade karakterleri içeriyorsa dikkatli olmalısınız, '/.../' içinde '# {Regexp.quote (some_string)}' kullanmayı düşünün. – TWiStErRob

12

Tam Isaac çözümü destekliyoruz, ama şunları da yapabilirsiniz:

a = "\/static\/workout\/[A-Z]{1,4}" + "033112" + "[A-Z]{1,5}-EQB.html" 
regex = Regexp.new(a) 
stringtomatch =~ regex 
+0

Bu yüzden b = Regexp.new (a) gibi bir şey ve daha sonra/b/eşleşme yapmak için bir şey olurdu. – Mutuelinvestor

+0

Cevabımı düzenleyeceğim. Ayrıca Isaac'ın cevabını doğru ışığa koymanıza da yardımcı olabilir. –

+3

Buna eklemek için '/' dizeleri için '/' dize gelme şeklini düşünmek yararlıdır: Bazı metinlerde normal ifadeleri ifade etmenize izin verir. Bu regex'e sahip olduğunuzda, * uygulayarak * regex'in bir rejimin yaratılışından mı yoksa başka bir şekilde regex oluşturmasından mı kaynaklandığı ayrı bir süreçtir.Yani bir ip atmak ve onu bir regex'e dönüştürmek ve sonra uygulamak herhangi bir eğik çizgi içermez. nesnesi, üzerine 'to_s 'çağırarak ve sonra bu dizgeyi yazdırmak herhangi bir tırnak işareti gerektirmez. Yukarıdaki örneğim sadece bir meraklı kelimesidir, bu yüzden tamamen farklı bir yoldur. –