2012-02-08 2 views
1

나는 큰 자바 스크립트 배열, 5000 정도의 항목이 있습니다. 합리적으로 실행 가능한 방식으로 모든 배열 항목에 대해 RegExp 일치를 실행하려면 exec를 반복하고 그룹을 꺼내지 않는 것이 좋습니다. 나는 exec보다 훨씬 빨리 그룹화하지 않고서도 일치를 발견했다.자바 스크립트 정규식, 그룹 또는 긍정적 인 lookbehind없이 일치

이 더 긍정적 인 lookbehind 작업이없는 것이 표준 정규식 툴킷을 사용하여 오탐 (false positive)을 타격하지 않고 다음 값과 일치하는 번호 만 취할 수 있습니까?

// the value to be matched 
    var reference_field = ',1,3,8,123,'; 
    // a series of reference id to match 
    var re = /(?:3|8)(?=,)/g; 
    reference_field.match(re); 
    // result, note that the second three was not intended --> ["3", "8", "3"] 

배열이 너무 길지 않은 경우 번호를 그룹화하면됩니다. 예 :

// the value to be matched 
    var reference_field = ',1,3,8,123,'; 
    // a series of reference id to match 
    var re = /,(3|8)(?=,)/g; 
    var match; 
    while(match = re.exec(reference_field)){ 
     if (match == null) {break;} 
     // do something with match[1] 
    } 

...하지만 그 의미는 모바일이 대상 플랫폼이기 때문에 속도에 민감합니다. 나는 정규식 속임수를 놓치고 있느냐, 아니면 그룹화하지 않고는 불가능한가? 모든 자바 스크립트 긍정적 인 lookbehind 대안 (쉼표에 부정적인 lookahead) 또는 추가 처리 오버 헤드를 소개 작동하지 않습니다.

답변

0

\b 시퀀스는 단어의 시작과 끝의 단어 경계와 일치합니다. 당신이 당신의 문자열은 항상이 쉼표로 구분 된 번호 목록입니다 알고 있다면 다음이 적절한 일치하는 항목을 찾아 낼 것입니다 :

/\b(?:3|8)\b/g 

또한 시작과 reference_field의 끝 부분에있는 여분의 쉼표가 필요하지 않을 것입니다.

+0

실제로! 감사. – pragmar

관련 문제