날짜 시간 형식에 대한 동적 정규식
-
09-06-2019 - |
문제
주어진 날짜 시간 형식 패턴에서 정규식을 동적으로 생성하는 기존 솔루션이 있습니까?지원되는 날짜 시간 형식 패턴은 중요하지 않습니다(Joda DateTimeFormat, java.text.SimpleDateTimeFormat 또는 기타).
즉.지정된 날짜-시간 형식(예: "dd/MM/yyyy hh:mm")에 대해 지정된 형식 내의 날짜-시간과 일치하는 해당 정규식을 생성합니다.
해결책
시간 형식을 구성할 수 있는 알파벳이 제한된 것 같습니다.그 의미는, "HH"
24시간제 기준으로 항상 "시간"입니다. "dd"
항상 앞에 0이 붙는 식입니다.
시간 형식의 순차적 특성으로 인해 형식 문자열을 토큰화하려고 시도할 수 있습니다. "dd/mm/yyyy HH:nn"
배열로 ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]
.그런 다음 교체하여 해당 배열에서 패턴 문자열을 형성하십시오. "HH"
~와 함께 "([01][0-9]|2[0-3])"
등등.이러한 패턴 원자를 조회 테이블/배열로 미리 구성합니다.조회 테이블에 없는 배열의 모든 부분은 리터럴입니다.정규식 규칙에 따라 이스케이프하고 패턴 문자열에 추가합니다.
편집하다:정규식 기반 솔루션의 부작용으로 조회 테이블의 모든 정규식 "원자"를 괄호에 넣고 주어진 형식 문자열에서 순서를 추적하면 하위 일치를 사용하여 필요한 구성 요소를 추출할 수 있습니다. 일치 항목에서 이를 CreateDate 함수에 공급하므로 ParseDate 부분을 완전히 건너뜁니다.
다른 팁
기본적인 날짜 확인을 찾고 있다면.이 코드는 이 데이터와 일치합니다.
\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b
10/07/2008
10.07.2008
1-01/2008
10/07/08
10.07.2008
1-01/08
regexbuddy를 통한 코드
SimpleDateFormat
이미 이 작업을 수행하고 있습니다. parse()
방법.
단일 문자열에서 여러 날짜를 구문 분석해야 하는 경우 정규식으로 시작하고(너무 관대하게 일치하더라도) 다음을 사용하십시오. parse()
정규식으로 찾은 모든 잠재적 일치 항목에 대해.
아래에 제공된 js/jQuery 코드는 날짜 시간이 아닌 날짜 형식에 대해서만 동적 생성 정규식을 생성합니다(개발 버전은 아직 완전히 테스트되지 않았습니다.)
날짜 형식은 " D M Y "여야 합니다.
예.
DD-MM-YY,
DD-MM-YYYY,
YYYY-MM-DD,
YYYY-DD-MM,
MM-DD-YYYY,
MM-DD-YY,
DD/MM/YY,
DD/MM/YYYY,
YYYY/MM/DD,
YYYY/DD/MM,
월/일/년,
월/일/연도
또는 다른 형식이지만 [DM Y] 문자로 생성됨
var dateFormat = "DD-MM-YYYY";
var order = [];
var position = {"D":dateFormat.search('D'),"M":dateFormat.search('M'),"Y":dateFormat.search('Y')};
var count = {"D":dateFormat.split("D").length - 1,"M":dateFormat.split("M").length - 1,"Y":dateFormat.split("Y").length - 1};
var seprator ='';
for(var i=0; i<dateFormat.length; i++){
if(["Y","M","D"].indexOf(dateFormat.charAt(i))<0){
seprator = dateFormat.charAt(i);
}else{
if(order.indexOf(dateFormat.charAt(i)) <0 ){
order.push(dateFormat.charAt(i));
}
}
}
var regEx = "^";
$(order).each(function(ok,ov){
regEx += '(\d{'+count[ov]+'})'+seprator;
});
regEx = regEx.substr(0,(regEx.length)-1);
regEx +="$";
var re = new RegExp(regEx);
console.log(re);
참고- 몇 달 / 일 예를 들어 검증 점검이 없습니다.월은 01-12여야 하고 날짜는 01-31이어야 합니다.