웹솔루션개발 22년 노하우! 해피CGI의 모든것

[해피CGI][cgimall] 날짜 패턴 검사와 후참조(backreference) 본문

웹프로그램밍 자료실/알짜자료 골드팁

[해피CGI][cgimall] 날짜 패턴 검사와 후참조(backreference)

해피CGI윤실장 2017. 2. 28. 09:31
날짜 입력값의 패턴 검사를 해 보겠습니다. 날짜 입력값이 yyyy-mm-dd나 yyyy/mm/dd는 인정하고 그 외의 패턴은 인정하지 않는다고 한다면 다음과 같이 간단한 정규식을 사용하면 됩니다.
[프로그램코드]
if( $dateinput =~ m|^\d{4}([-/])\d{1,2}\1\d{1,2}$| ) { print "Good\n"; } else { print "Not good\n"; }

여기서 상세한 날짜 범위에 대한 검증은 생략하겠습니다. 이 팁의 촛점은 그 것이 아니라 구분자에 관한 것이니까요. 얼핏생각하면 패턴 검사를
[프로그램코드]
$dateinput =~ m|^\d{4}([-/])\d{1,2}[-/]\d{1,2}$|

와 같이 하면 될 것이라고 생각할 수 있습니다. 하지만, 이 경우는 yyyy-mm/dd나 yyyy/mm-dd도 옳은 것으로 인정해 주기 때문에, 썩 좋은 해법이라고 보기 어렵습니다. 그래서
[프로그램코드]
$dateinput =~ m|^\d{4}-\d{1,2}-\d{1,2}$| or $dateinput =~ m|^\d{4}/\d{1,2}/\d{1,2}$|

라고 할 수도 있으나, 그 보다는 맨 위의
[프로그램코드]
$dateinput =~ m|^\d{4}([-/])\d{1,2}\1\d{1,2}$|

가 훨씬 간결합니다. \1은 후참조(backreference)라고 합니다. 정규식 패턴 내에서 앞의 괄호가 일치할 때, 패턴 내부에서 다시 참조할 수 있도록 별도로 저장해둔 내용을 참조하는 것입니다. 이 것은 패턴 외부에서 $1, $2, $3...를 사용하는 것과는 달리, 패턴 내부에서 사용합니다. 그래서 년과 월의 사이에 사용되는 구분자가 똑같이 월과 일의 사이에서 사용된 경우에만 올바른 패턴으로 결정할 수 있게 됩니다. 후참조 역시 $1, $2, $3...와 같이 \1, \2, \3...로 사용됩니다. 만일 날짜 + 시간 패턴을 검사한다면, 다음과 같이 사용할 수 있습니다.
[프로그램코드]
)\d{1,2}\1\d{1,2} \d\d([-:])\d\d\2\d\d$|

정규식의 세계는 정말 깊습니다. 이 글은 http://www.perl.or.kr/tips/backref.html에서 발췌된 글입니다.

 

홈페이지바로가기 

Comments