2012-03-29 11 views
17

Używam następującego wyrażenia regularnego do marszu hrefs na stronie internetowej.Czy jest możliwe utworzenie dynamicznego wyrażenia regularnego w Ruby

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

Chciałbym znaleźć sposób, aby część 032812 wyrażenia regularnego dynamiczny, tak że wartość będzie odzwierciedlać aktualną datę. Fore przykład, w dniu 31 marca 2012 r wyrażenie regularne będzie wyglądać następująco:

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

Próbowałem tworząc ciąg

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

a następnie

\ a \ 

ale to nie działa. Czy jest sposób na zrobienie tego.

Odpowiedz

52

Możesz użyć #{} tak jak w ciągu znaków.

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

Dzięki! Skopię się za to, że nie wymyśliłem tego. Jeszcze raz dziękuję, doceń swoją pomoc. – Mutuelinvestor

+0

Czy działa na Ruby 2.2.0? – MC2DX

+1

@ MateuszCzerwiński To działa w Rubim 2.2, ale powinieneś być ostrożny, jeśli zmienna może zawierać wyrazy regularne, rozważ użycie '# {Regexp.quote (some_string)}' wewnątrz '/.../'. – TWiStErRob

12

pełni popieram rozwiązanie Izaaka, ale można również:

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

Czyli byłoby to coś w stylu b = Regexp.new (a), a następnie/b /, aby wykonać dopasowanie. – Mutuelinvestor

+0

Będę edytować moją odpowiedź. Może to również pomóc w znalezieniu odpowiedzi Izaaka w odpowiednim świetle. –

+3

Aby dodać do tego, warto pomyśleć o '/' w wyrażeniach regularnych w sposób, w jaki myślisz o '' 'dla łańcuchów: pozwala ci wyrażać wyrażenie regularne z jakiegoś tekstu. Gdy masz już wyrażenie regularne, * zastosowanie * to jest osobnym procesem, który nie przejmuje się zbytnio, czy regex pochodzi z dosłownego, czy w inny sposób generowania wyrażeń regularnych, więc wybranie ciągu i przekształcenie go w wyrażenie regularne, a następnie zastosowanie go nie pociąga za sobą żadnych ukośników, tak samo jak robienie obiekt, wywołanie 'to_s' na nim, a następnie wydrukowanie tego łańcucha nie wymaga żadnych cytatów. Mój powyższy przykład jest tylko bardziej dosadny, więc jest to zupełnie inna ścieżka. –

Powiązane problemy