Как преобразовать шаблон глобуса в шаблон регулярного выражения в Ruby?
Шаблоны глобусов похожи на шаблоны регулярных выражений, но не идентичны. Учитывая строку глобуса, как преобразовать ее в соответствующую строку регулярного выражения?
Я написал частичную реализацию этого как часть гема 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
personAlexChaffeeschedule30.06.2012
comment
Прохладный. Одно небольшое улучшение - это отображение { в (?:, поскольку вам действительно не нужно его захватывать.
- personglenn jackman; 01.10.2014