2012-06-30 2 views

답변

2

나는 이것을 rerun 보석의 일환으로 부분적으로 작성했지만 누군가가 더 좋은 방법을 알고 있다면 나는 그것에 대해 듣고 싶다. 내 코드는 다음과 같습니다 (최신 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 
+1

차갑다. 사소한 개선점 중 하나는'{'를'(? :')에 매핑하는 것입니다. –