使用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
答案 0 :(得分:2)
使用Regexp.union
:
返回一个Regexp对象,它是给定模式的并集,即匹配任何部分。 模式可以是Regexp对象,在这种情况下,它们的选项将被保留,或者是字符串。如果没有给出模式,则返回
/(?!)/
。
请注意,如果有任何特殊字符,它们将被转义以匹配文字字符。
所以,使用
"abc" =~ /^\d+[[:space:]]*#{Regexp.union(TOKENS)}/
^^^^^
在Ruby 2.4中,您可以使用.match?
:
/^\d+[[:space:]]*#{Regexp.union(TOKENS)}/.match?('abc')
^^^^^ ^^^^^^