【问题标题】:How to convert between a glob pattern and a regexp pattern in Ruby?如何在 Ruby 中的 glob 模式和正则表达式模式之间进行转换?
【发布时间】:2012-07-01 21:04:04
【问题描述】:

Glob 模式类似于正则表达式模式,但不相同。给定一个 glob 字符串,如何将其转换为相应的正则表达式字符串?

请参阅 Dir#glob 和 Perl 的 Text-Glob 库,以及 Create regex from glob expression(用于 python)。

【问题讨论】:

    标签: ruby regex glob


    【解决方案1】:

    作为rerun gem 的一部分,我已经编写了它的部分实现,但如果有人知道更好的方法,我很想听听。这是我的代码(最新的 codetests 在 github 上)。

    class Glob
      NO_LEADING_DOT = '(?=[^\.])'   # todo
    
      def initialize glob_string
        @glob_string = glob_string
      end
    
      def to_regexp_string
        chars = @glob_string.split('')
        in_curlies = 0;
        escaping = false;
        chars.map do |char|
          if escaping
            escaping = false
            char
          else
            case char
              when '*'
                ".*"
              when "?"
                "."
              when "."
                "\\."
    
              when "{"
                in_curlies += 1
                "("
              when "}"
                if in_curlies > 0
                  in_curlies -= 1
                  ")"
                else
                  char
                end
              when ","
                if in_curlies > 0
                  "|"
                else
                  char
                end
              when "\\"
                escaping = true
                "\\"
    
              else
                char
    
            end
          end
        end.join
      end
    end
    

    【讨论】:

    • 酷。一个小的改进是将{ 映射到(?:,因为您实际上并不需要捕获它。
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    相关资源
    最近更新 更多