정규식 및 역 참조로 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 파일을 선택하거나 런타임에 원하는 세트를 선택하십시오.
'Program Tip' 카테고리의 다른 글
JPA (및 해당 조인 테이블 행)에서 ManyToMany 관계가있는 엔티티를 제거하는 방법은 무엇입니까? (0) | 2020.10.07 |
---|---|
Safari의 iPad WebApp 전체 화면 (0) | 2020.10.07 |
항목 X에 대한 게시 속성을 적용 할 수 없습니다. (0) | 2020.10.07 |
jQuery의 Grep 대 필터? (0) | 2020.10.07 |
추가 포장을 피하는 방법 (0) | 2020.10.07 |