Нахождение соответствия регулярному выражению из массива регулярных выражений - PullRequest
1 голос
/ 16 апреля 2011
def match_line regex
    @line.match(regex) if !regex.is_a?(Array)
    regex.each {|rgx| 
        results = @line.match(rgx) 
        return results if !results.nil? 
    }
    return nil
end

Это похоже на то, что может быть сделано в одной строке идиоматическим способом, и я просто не вижу, как.

Ответы [ 4 ]

5 голосов
/ 16 апреля 2011
[*regex].map{ |re| @line.match re }.compact.first

или

Array(regex).map{ |re| @line.match re }.compact.first
1 голос
/ 16 апреля 2011
 [*regex].find{|r| @line.match(r)}
 return $~ #will return the last MatchedData returned, otherwise nil.

$~ возвратит последний возвращенный MatchedData, в противном случае ноль.

0 голосов
/ 16 апреля 2011

В данном случае предпочтительной является установившаяся практика передачи аргументов, таких как

match_line(regex1, regex2, ...)

или

match_line(*array_of_regexes)

вместо

match_line([regex1, regex2, ...])

или

match_lines(array_of_regexes)

так что ваше согласование с массивом не требуется.

def match_line *regex
  regex.detect{|r| @line =~ r}
  Regexp.last_match
end
0 голосов
/ 16 апреля 2011
def match_line regex
  [*regex].each { |r| return r if (r = @line.match r) }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...