2011-11-03 2 views
34

Ruby를 처음 사용하며 숫자의 첫 번째 항목을 검색 할 때 항상 String.scan을 사용했습니다. 반환 값이 중첩 배열에있는 것이 이상한 일이지만, 원하는 값으로 [0][0]을 사용하면됩니다. (나는 그것이 그것의 목적을 가지고 있다고 확신하는데, 아직 사용하지 않았다.)Ruby 문자열의 검색과 일치의 차이점

나는 방금 String.match 방법이 있다는 것을 알았다. 반환 된 배열이 중첩되어 있지 않으므로 더 편리합니다. 로,

>> 'a 1-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"]] 

그때 나는 API를 확인이 일치

>> 'a 1-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 

,하지만 난 정말 차이를 구별 할 수 없습니다 여기

먼저 스캔되어 두의 예입니다 둘 다 '패턴 일치'라고 언급했습니다.

이 질문은 단순히 호기심에 대한 것인데, scan이 할 수있는 것이 무엇인지에 관한 것입니다. match은 그럴 수없고 그 반대입니다. 단 하나의 시나리오 만 성취 할 수 있습니까? 의 match은 열등합니까?

답변

40

짧은 대답 : scan는 모든 경기를 반환합니다. 첫 번째 경기 만 원할 경우 str.match[2]str.scan[0][1]보다 훨씬 좋기 때문에이 방법이 더 우수하지는 않습니다.

ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"], ["a ", "2"]] 
ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 
17

#scan은 정규식과 일치하는 모든 것을 반환합니다. (즉 인덱스 0에 매핑을 무엇의 정규식 일치 있었는지), $1 (1 경기), $2, 등

#match$& 같은 특별한 변수가 보유한 데이터를 포함하는 MatchData 객체와 첫 경기를 반환합니다.

관련 문제