2016-06-10 3 views
0

그래서 난 내 자바 스크립트/HTML에 대비 연습 시험을하고있는 중이 야하고, 질문 중 하나는 다음과 같습니다하지 않는 분명히하는자바 스크립트 : 정규식을 사용하여 분할하고 저장 하시겠습니까?

function check(date_str){ 
    var split1 = date_str.split(" "); 
    var split2 = date_str.split(":"); 
    var split3 = split1[3].slice(0,2); 
    var obj = [ 
    {"month": split1[0]}, 
    {"date": split1[1]}, 
    {"year": split1[2]}, 
    {"hour": split3}, 
    {"minute": split2[1]}, 
    {"second": split2[2]} 
    ]; 
    return obj; 

: 내가했다 해낸 Practice exam question

질문은 우리에게도 물어 마찬가지로 정규식을 사용합니다. 나는이 일을 시도 :

(+ w \)

(\ D +) (\ D +) (\ D +) : (\ D +) : 그것은 바로 아닌지 모르겠어요 (\ D +)

.

내가 가지고있는 또 다른 질문은 정규식 표현식에서 JSON 객체로 분할 된 문자열을 저장하는 방법을 잘 모르겠다는 것입니다. 그들은 분할 후에 배열에 저장되어 있습니까? 색인이 있습니까?

제발 어떤 포인터를주고 올바른 방향으로 나를 가리켜 주셔서 감사합니다!

답변

3

따라서 캡처 그룹을 유용하게 활용할 수있는 좋은 기회입니다.

입력 문자열이 엄격하게 형식화되었으므로 입력 문자열을 사용하여 정규 표현식을 만들 수 있습니다. 그것부터 시작합시다. 입력 문자열을 가지고 다음이 있어야 무엇으로 그것을 무너 뜨리는 : 문자열 형식

  1. 시작 : /CCC dd yyyy hh:mm:ss/
  2. d, yh, ms 모든 정확히 하나의 숫자입니다 /CCC \d\d \d\d\d\d \d\d:\d\d:\d\d/
  3. 정확한 수량 자와
  4. 단순화 : /CCC \d{2} \d{4} \d{2}:\d{2}:\d{2}/
  5. CCC는 jan, feb, 또는 mar 할 수있다, 그래서 우리는 비 캡처 GROU와 그것을 대체 할 수 있습니다 세 가지 옵션 페이지 : /(?:jan|feb|mar) \d{2} \d{4} \d{2}:\d{2}:\d{2}/
  6. 다음은 달 필드는 대소 문자를 구분해야하고, 나머지는 숫자와 공백, 그래서 우리는 안전하게 대신 직접 처리 옵션의 케이스를 구분 플래그, i를 사용할 수 있습니다 /(?:jan|feb|mar) \d{2} \d{4} \d{2}:\d{2}:\d{2}/i
  7. 마지막으로, 지침은 요소 사이에 하나 개 이상의 공간이 될 수 있다고, 그래서 우리는 각각의 공간 후에 적절한 정량을 추가해야 추가 : /(?:jan|feb|mar) +\d{2} +\d{4} +\d{2}:\d{2}:\d{2}/i

당신은 지금 당신의 입력 요구 사항을 정확하게 일치하는 정규 표현식을 : /(?:jan|feb|mar) +\d{2} +\d{4} +\d{2}:\d{2}:\d{2}/i

그러나 필요한 데이터를 가져올 수는 없습니다. 이를 위해서는 캡처 그룹을 사용해야합니다. 필요한 각 필드에 대해 일치하는 문자 주위에 캡처 그룹을 지정하십시오. (또는, 달의 경우, 단지 캡처 그룹에 비 캡처 그룹을 변환 할 ?:를 제거합니다.) /(jan|feb|mar) +(\d{2}) +(\d{4}) +(\d{2}):(\d{2}):(\d{2})/i

이 당신에게 여섯 개 캡처 그룹, 당신이 필요로하는 필드마다 1 개를 제공합니다. 거기에서 새로운 객체의 필드를 채우는 것입니다.

// Here's the function. 
function check(date_string){ 
    // Make the pattern and use it to match the date_string. 
    var date_pattern = /(jan|feb|mar) +(\d{2}) +(\d{4}) +(\d{2}):(\d{2}):(\d{2})/i; 
    var match = date_string.match(date_pattern); 

    // If it wasn't a match, return null. 
    if (!match) return null; 

    // Otherwise, return a new object from the capture groups. 
    return { 
     month: match[1], 
     date: match[2], 
     year: match[3], 
     hour: match[4], 
     minute: match[5], 
     second: match[6] 
    }; 
} 

// This bit is test code. 
var input_string = "Jan 10 2016 10:11:12"; 
var result = check(input_string); 
if (result) console.log(JSON.stringify(result,null,2)); 
else console.log("Result was null"); 

는 희망이 도움이 :

여기에 전체 코드입니다. Regex는 일단 완전히 배우면 멋지고 강력한 도구입니다.

** 편집 : 다른 작성자가 말했듯이 Regex101은 정규식을 테스트하고 디버그하는 데 도움이되는 놀라운 도구입니다. 나는 그것을 직업 생활에서 매일 사용한다. repl.it이라는 또 다른 유용한 도구가 있습니다.이 도구는 임의의 자바 스크립트 코드 (다른 언어와 마찬가지로)를 작성하고 실행하는 데 유용합니다. 이것이 제가 제공 한 코드를 테스트 할 때 사용되었습니다.

+0

와우 아주 좋습니다! 나는 결코 이런 식으로 생각하지 않았을 것이다. 그것이 바로 컴퓨터 과학이 어떻게 된 것인지를 짐작할 수있다. 고마워요! –

+0

@HermanLeeTzerHer, 도와 주셔서 감사합니다. –

관련 문제