나는 이것을 rerun 보석의 일환으로 부분적으로 작성했지만 누군가가 더 좋은 방법을 알고 있다면 나는 그것에 대해 듣고 싶다. 내 코드는 다음과 같습니다 (최신 code 및 tests이 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
차갑다. 사소한 개선점 중 하나는'{'를'(? :')에 매핑하는 것입니다. –