【问题标题】:How do I build a regular expression from an array?如何从数组构建正则表达式?
【发布时间】:2017-07-24 05:37:58
【问题描述】:

使用 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

【问题讨论】:

  • Regexp.union替换Regexp.escape

标签: ruby-on-rails arrays ruby regex


【解决方案1】:

使用Regexp.union:

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

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

所以,使用

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

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

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

【讨论】:

  • 使用“=~”与“match”之间是否存在性能差异?
  • 戴夫,当然不是,考虑到r.match?(str) 只不过是str =~ r ? true : false!!(str =~ r)
  • @CarySwoveland 看到Regexp#match? 不产生任何捕获、设置特殊变量等,认为它实际上可能具有不同的性能特征并非不合理,因为它可能通过跳过来优化正常匹配过程的某些步骤。请注意,我并不是说它确实具有那些取决于 C 实现的性能特征。
  • @CarySwoveland 事实上,Regexp#match? 的引入在the release notes for 2.4.0 中被明确列为性能增强,因为它避免了由其他方法执行的对象分配,例如Regexp#match=~
  • @philomory,好点,感谢您的澄清。我在解决match? 是否与=~ 一样高效的问题,而忽略了match? 是否可能更高效的问题。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多