加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby中的通配符字符串匹配

发布时间:2020-12-16 22:44:59 所属栏目:百科 来源:网络整理
导读:我想编写一个实用程序函数/模块,它将为字符串提供简单的通配符/ glob匹配.我不使用正则表达式的原因是,用户将是最终提供使用某种配置文件匹配的模式的用户.我找不到任何这样的宝石是稳定的 – 尝试的小丑,但它有问题设置. 我正在寻找的功能很简单.例如,给出
我想编写一个实用程序函数/模块,它将为字符串提供简单的通配符/ glob匹配.我不使用正则表达式的原因是,用户将是最终提供使用某种配置文件匹配的模式的用户.我找不到任何这样的宝石是稳定的 – 尝试的小丑,但它有问题设置.

我正在寻找的功能很简单.例如,给出以下模式,以下是匹配:

pattern | test-string         | match
========|=====================|====================
*hn     | john,johnny,hanna | true,false,false     # wildcard,similar to /hn$/i
*hn*    | john,true,false     # like /hn/i
hn      | john,hanna | false,false     # /^hn$/i
*h*n*   | john,true
etc...

我希望这样尽可能高效.我想到从模式字符串创建正则表达式,但在运行时看起来效率很低.关于这个实现的任何建议?谢谢.

编辑:我使用的是ruby 1.8.7

解决方法

我不明白你为什么认为这是无效率的.关于这些事情的预测是众所周知的不可靠的,你应该决定它太慢,然后才能向后弯曲找到更快的方式.然后你应该配置它,以确保这是问题所在的地方(btw平均有3-4倍的速度提升从切换到1.9)

无论如何,应该很容易做到这一点,像:

class Globber 
  def self.parse_to_regex(str)
    escaped = Regexp.escape(str).gsub('*','.*?')
    Regexp.new "^#{escaped}$",Regexp::IGNORECASE
  end

  def initialize(str)
    @regex = self.class.parse_to_regex str
  end

  def =~(str)
    !!(str =~ @regex)
  end
end


glob_strs = {
  '*hn'    => [['john',],['johnny',['hanna',false]],'*hn*'   => [['john','hn'     => [['john','*h*n*'  => [['john',true ]],}

puts glob_strs.all? { |to_glob,examples|
  examples.all? do |to_match,expectation|
    result = Globber.new(to_glob) =~ to_match
    result == expectation
  end
}
# >> true

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读