ruby - 如何在 Ruby 中的 glob 模式和正则表达式模式之间进行转换?

标签 ruby regex glob

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

参见Dir#glob和 Perl 的 Text-Glob图书馆,和Create regex from glob expression (对于Python)。

最佳答案

我已经编写了此部分的实现,作为 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

关于ruby - 如何在 Ruby 中的 glob 模式和正则表达式模式之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11276909/

相关文章:

regex - 在单独的文件中提取具有特定模式的行

c++ - 如何让正则表达式匹配句子的中间?

c++ - 用什么代替 C++ Qt 上的 glob?

java - 如何为 Dataflow 作业指定多个输入路径

ruby-on-rails - 这段代码是做什么的,我怎样才能更简单地编写它?

ruby - 我可以判断一个方法是否需要在 ruby​​ 中返回一些东西吗?

ruby - RVM:在系统范围安装中从 .rvmrc 文件加载 gemset 时权限被拒绝

ruby-on-rails - Rails url 助手在 namespace Controller 中不可用

regex - vim 对齐小数点

python - 引发运行时错误 ('FPDF error: ' +msg) 运行时错误 : FPDF error: Unsupported image type: chapter_1_romance_dawn