Как преобразовать шаблон глобуса в шаблон регулярного выражения в Ruby?

Шаблоны глобусов похожи на шаблоны регулярных выражений, но не идентичны. Учитывая строку глобуса, как преобразовать ее в соответствующую строку регулярного выражения?

См. Dir # glob и библиотека Text-Glob и Создать регулярное выражение из выражения glob (для Python).


person AlexChaffee    schedule 30.06.2012    source источник


Ответы (1)


Я написал частичную реализацию этого как часть гема rerun, но если кто-то знает способ получше, Я бы хотел об этом услышать. Вот мой код (последний код и тесты доступны на 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
person AlexChaffee    schedule 30.06.2012
comment
Прохладный. Одно небольшое улучшение - это отображение { в (?:, поскольку вам действительно не нужно его захватывать. - person glenn jackman; 01.10.2014