2013-08-09 3 views
0

이것은 정확히 문제는 아니지만 방법에 대한 더 많은 질문입니다. 사람들이 입력 필드에 속기 날짜를 입력 할 수있는 프로젝트에서 작업하고 있습니다. 예를 들어, 단순히 "20"을 입력하면 입력에 자동으로 이번 달 20 일의 전체 날짜가 표시됩니다. 가능한 많은 속기 유형이 있으므로 여러 RegExp를 만든 다음 각각을 확인해야했습니다.단일 함수에서 다중 RegExp

내 질문에이 문제를 해결할 더 좋은 방법이 있습니까? 나는 javaScript 전문가가 아니지만, 이것이 정확한 "우수 사례"가 아니라는 느낌을 가지고있다.

다음은 설명하는 문제가 Natural Language Processing, 프로그래밍/쿼리 언어 디자인의 필드로 달려되는 함수

function dateParser(date) { 
      var splitDate = date.split(/[.:\s]/); 
      var day = new RegExp(/\b\d{1,2}\b/); 
      var dateHour = new RegExp(/\b\d{1,2}\s\d{1,2}\b/); 
      var dateHourMin = new RegExp(/\b\d{1,2}\s\d{1,2}[:]\d{1,2}\b/); 
      var dateMonth = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}\b/); 
      var dateMonthHour = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}\s\d{1,2}\b/); 
      var dateMonthHourMin = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}\s\d{1,2}[:]\d{1,2}\b/); 
      var dateMonthYear = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}[\/\-\,\.]\d{1,4}\b/); 
      var dateMonthYearHour = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}[\/\-\,\.]\d{1,4}\s\d{1,2}\b/); 
      var dateMonthYearHourMin = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}[\/\-\,\.]\d{1,4}\s\d{1,2}[:]\d{1,2}\b/); 
      var month = new Date().getMonth() + 1; 
      var year = new Date().getFullYear(); 

      var newDate; 
      if(dateMonthYearHourMin.test(date)) { 
       newDate = splitDate[0]+"."+splitDate[1]+"."+splitDate[2]+" "+splitDate[3]+":"+splitDate[4]; 
      } 
      else if(dateMonthYearHour.test(date)) { 
       newDate = splitDate[0]+"."+splitDate[1]+"."+splitDate[2]+" "+splitDate[3]+":00"; 
      } 
      else if(dateMonthYear.test(date)) { 
       newDate = splitDate[0]+"."+splitDate[1]+"."+splitDate[2]+" 12:00"; 
      } 
      else if(dateMonthHourMin.test(date)) { 
       newDate = splitDate[0]+"."+splitDate[1]+"."+year+" "+splitDate[2]+":"+splitDate[3]; 
      } 
      else if(dateMonthHour.test(date)) { 
       newDate = splitDate[0]+"."+splitDate[1]+"."+year+" "+splitDate[2]+":00"; 
      } 
      else if(dateMonth.test(date)) { 
       newDate = splitDate[0]+"."+splitDate[1]+"."+year+" 12:00"; 
      } 
      else if(dateHourMin.test(date)) { 
       newDate = splitDate[0]+"."+month+"."+year+" "+splitDate[1]+":"+splitDate[2]; 
      } 
      else if(dateHour.test(date)) { 
       newDate = splitDate[0]+"."+month+"."+year+" "+splitDate[1]+":00"; 
      } 
      else if(day.test(date)) { 
       newDate = splitDate[0]+"."+month+"."+year+" 12:00"; 
      } 
      return newDate; 
     } 

답변

0

저는 정규 표현식 중 일부를 통합하여 더 간단하게 만들 수 있다고 생각합니다.

먼저주의해야 할 점은 공백이 입력 문자열에 중요한 분리 문자로 나타나는 것입니다. 특히 날짜 (또는 요일)는 항상시/분과 공백으로 구분됩니다. (있는 경우)

var parts = date.split(/\s/); 
var datePart = parts[0]; 
var timePart = parts[1];  // could be undefined 

이제 우리는 날짜 부분과 시간 부분을 처리 할 수있는 별도 : 그래서 내가 할 것이 우선 공간에 귀하의 의견을 나눌 수 있습니다. 당신의 날짜 부분의 구성 요소는 항상 다시 우리는 단지 그것을 나눌 수, 슬래시, 대시, 쉼표 나 마침표로 구분됩니다 :

parts = datePart.split(/[\/\-\,\.]/); 
var day = parts[0]; 
var month = parts[1] // could be undefined 
var year = parts[2]; // could be undefined 

당신은 유사하게 시간을 나눌 수, 시간 및 분이기 때문에 항상 콜론으로 구분 :이이 좀 더 콤팩트하고 쉽게 읽고 유지해야

if(timePart) { 
    parts = timePart.split(/:/); 
    var hour = parts[0]; 
    var minute = parts[1]; // could be undefined 
} 

. 그룹을 가진 단수의 정규 표현식을 사용하면 훨씬 더 컴팩트해질 수 있지만,이 접근법이 더 좋을 것이라고 생각합니다.

+0

나에게 이것은 훨씬 더 깨끗한 방법입니다. 내 마음에 RegExp가 유일한 방법 이었지만 이것은 아주 좋은 대안입니다! –

0

입니다.

이러한 종류의 문제를 해결하기위한 접근법 중 하나는 RegExp/다른 문자열 검색을 사용하여 직접 작성한 스캐너로 결과와 함께 작업하는 것입니다. 그것은 단순한 언어에서 작동하며, 언어 디자인 부서에서 많은 지식을 필요로하지 않으며 일반적으로 직관적으로 수정할 수 있습니다.

입력이 점점 복잡해지고 있다고 느낀다면 RegExp를 본격적인 파서/렉서로 대체하는 것이 좋습니다. 예를 들어 Jison"친숙한 JavaScript 파서 생성기!" 또는 귀하에게 적합한 기타.