是否可以在Ruby中创建动态正则表达式

Mut*_*tor 23 ruby regex

我正在使用以下正则表达式来在网页上进行hrefs.

\/static\/workout\/[A-Z]{1,4}032812[A-Z]{1,5}-EQB.html
Run Code Online (Sandbox Code Playgroud)

我想找到一种方法使正则表达式的032812部分动态化,这样该值将反映当前日期.例如,2012年3月31日,正则表达式如下所示:

\/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个字符串

a = \/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html
Run Code Online (Sandbox Code Playgroud)

然后

\ a \
Run Code Online (Sandbox Code Playgroud)

但这没用.有没有办法做到这一点.

小智 60

你可以#{}像在字符串中一样使用.

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/ 
Run Code Online (Sandbox Code Playgroud)

  • @MateuszCzerwiński这适用于Ruby 2.2,但是如果变量可能包含正则表达式字符,你应该小心,考虑在`/.../`中使用`#{Regexp.quote(some_string)}`. (4认同)

Ken*_*oom 17

我完全支持艾萨克的解决方案,但你也可以:

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

  • 为了补充一点,在正则表达式中考虑`/`是有帮助的,你会想到```for strings:它允许你从一些文本中表达一个正则表达式文字.一旦你有了正则表达式,*应用*它是一个单独的过程并不关心正则表达式是来自文字还是其他一些生成正则表达式的方法.所以取一个字符串并将其转换为正则表达式然后应用它不会涉及任何斜杠,就像拿一个对象一样,在它上面调用`to_s`然后打印该字符串不需要任何引号.我上面的例子只是一个更好的文字,所以它完全是一条不同的路径. (4认同)