如何从数组构建正则表达式?

时间:2017-03-03 23:39:36

标签: ruby-on-rails arrays ruby regex

使用Ruby 2.4,如何使用包含字符串的数组构建正则表达式?我有

TOKENS = %w(to - &).freeze

我想构建一个正则表达式,表示匹配至少一个数字,任意破坏或不间断的空格,然后是我的数组中的一个字符串。我尝试了下面的结果错误

2.4.0 :014 > "abc" =~ /^\d+[[:space:]]*#{Regexp.escape(TOKENS)}/
TypeError: no implicit conversion of Array into String
    from (irb):14:in `escape'
    from (irb):14
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

匹配的一个例子是

2 to blah

和不匹配的东西将是

& no way

1 个答案:

答案 0 :(得分:2)

使用Regexp.union

  

返回一个Regexp对象,它是给定模式的并集,即匹配任何部分。 模式可以是Regexp对象,在这种情况下,它们的选项将被保留,或者是字符串。如果没有给出模式,则返回/(?!)/

请注意,如果有任何特殊字符,它们将被转义以匹配文字字符。

所以,使用

"abc" =~ /^\d+[[:space:]]*#{Regexp.union(TOKENS)}/
                                   ^^^^^

在Ruby 2.4中,您可以使用.match?

 /^\d+[[:space:]]*#{Regexp.union(TOKENS)}/.match?('abc')
                           ^^^^^           ^^^^^^