String matching in Ruby

Tags:

며칠전 뉴스그룹에 String contains one of these???라는 글이 올라왔습니다. 문제의 내용은

str="some stuff NL is chunky"
leagues=%w{1D 2D U16 U19 LR RR JNL NL}

와 같이 임의의 문자열과, 그 문자열 내에 존재하는지 여부를 알고싶은 키워드들의 배열이 주어졌을 때, 문자열내 키워드의 발생여부를 찾는 것입니다. 위의 예에선 NL이 검색되어서 나와야하죠. 간단한 답은

leagues.find_all { |league| str.include? league } 

라던가

leagues.select { |m| str.include?(m) }

가 될 수 있겠죠. 좀 더 현학적인 답은

puts str.scan(Regexp.new(leagues.join("|")))

입니다. 그러나 정말 깔끔한 답이 하나 있으니..

바로

puts leagues & str.split

더구나 이 방식은 속도마저도 가장 빠르죠. 세상에 언어가 이렇게 간단할 수 있다니…. 놀랐습니다.