Program Tip

정규식 및 역 참조로 Ruby switch 문 (case… when)을 작성하는 방법은 무엇입니까?

programtip 2020. 10. 7. 08:06
반응형

정규식 및 역 참조로 Ruby switch 문 (case… when)을 작성하는 방법은 무엇입니까?


정규식과 일치하는지 확인하기 위해 Ruby case 문을 작성할 수 있다는 것을 알고 있습니다. 그러나 내 return 문에서 일치 데이터를 사용하고 싶습니다. 이 반 의사 코드와 같은 것 :

foo = "10/10/2011"

case foo
    when /^([0-9][0-9])/
        print "the month is #{match[1]}"
    else
        print "something else"
end

어떻게 할 수 있습니까?

감사!


참고 : 위와 같이 간단한 경우에 switch 문을 사용하지 않을 것임을 이해합니다.하지만 이는 한 가지 예일뿐입니다. 실제로 제가 달성하고자하는 것은 다양한 방식으로 작성할 수있는 날짜에 대한 많은 잠재적 정규식을 매칭 한 다음 그에 따라 Ruby의 Date 클래스로 구문 분석하는 것입니다.


최신 정규식 일치 그룹에 대한 참조는 항상 다음에 대한 의사 변수 $1저장 됩니다 $9.

case foo
when /^([0-9][0-9])/
    print "the month is #{$1}"
else
    print "something else"
end

$LAST_MATCH_INFO가상 변수를 사용 하여 전체 MatchData개체 를 가져올 수도 있습니다 . 이것은 명명 된 캡처를 사용할 때 유용 할 수 있습니다.

case foo
when /^(?<number>[0-9][0-9])/
    print "the month is #{$LAST_MATCH_INFO['number']}"
else
    print "something else"
end

다음은 동일한 결과를 얻지 만 스위치를 사용하지 않는 대체 접근 방식입니다. 정규식을 배열에 넣으면 다음과 같이 할 수 있습니다.

res = [ /pat1/, /pat2/, ... ]
m   = nil
res.find { |re| m = foo.match(re) }
# Do what you will with `m` now.

선언 m블록 외부하면 계속 사용할 이후가 될 수 있도록 find블록으로 수행되며 find스위치가 당신을 제공한다는 동일한 바로 가기 지정 동작을 얻을 수 있도록 블록이 true 값을 반환하는 즉시 중지됩니다. MatchData필요한 경우 전체를 제공 하고 (정규식에서 명명 된 캡처 그룹을 사용하려는 경우) 검색 논리에서 정규식을 멋지게 분리합니다 (더 명확한 코드를 생성하거나 생성하지 않을 수 있음). config 파일을 선택하거나 런타임에 원하는 세트를 선택하십시오.

참고 URL : https://stackoverflow.com/questions/6803647/how-to-write-a-ruby-switch-statement-case-when-with-regex-and-backreferences

반응형