Tips in Action‎ > ‎정규식‎ > ‎

날짜패턴검사와 후참조(Backreference)

전종필

날짜 입력값의 패턴 검사를 해 보겠습니다.
날짜 입력값이 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...로 사용됩니다. 만일 날짜 + 시간 패턴을 검사한다면, 다음과 같이 사용할 수 있습니다.

m|^\d{4}([-/])\d{1,2}\1\d{1,2} \d\d([-:])\d\d\2\d\d$|

정규식의 세계는 정말 깊습니다 

Comments