我想编写一个实用程序函数/模块,它将为字符串提供简单的通配符/ 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