2015-01-27 3 views
-1

나는 그런 수는 문자가 포함 된 문자열을 순차적 숫자와 일치 할 수있는 기능을 만들려고 노력하고 있어요 :경기 연속 숫자

ae12/aeg12345km/mea65/ab2d43a21/poe09ac 등

문자열을 순서대로 (12는 연속, 1a2는 순차적이지 않음, 09는 순차적, a0b0은 순차적이지 않음, 00은 순차적이지 않음, 11은 순차적이지 않음, 112는 순차적 임)

몇 가지 주제로 갔고 정규식을 사용하여 가능하지 않습니다.

나는이 기능을 만들었지 만 나는 그것으로 완전히 만족하지 않다, 나는 그것을 개선하기 위해 싶습니다

containsSequentialDigits: function (str) { 
    var array = str.split(''); 
    var previousC = null; 
    return array.some(function (c) { 
     if (isNaN(c)) { 
      previousC = null; 
      return false; 
     } 
     if (c === previousC+1 || c === previousC-1 || 
      c === 0 && previousC === 9 || c === 9 && previousC === 0) { 
      return true; 
     } 
     previousC = c; 
     return false; 
    }); 
} 

당신이 그것을 단순화하기 위해 어떤 제안이 있습니까?

감사

+1

정규 표현식으로 불가능한 이유는 무엇입니까? 예상되는 결과는 무엇입니까? 합격/불합격을위한 규칙은 무엇입니까? – epascarello

+0

코드에 따르면 ab12323도 유효 할 것으로 보입니다. 그 맞습니까? – MingShun

+0

예, 두 자릿수가 옆에 있고 순차적이면 true를 반환합니다 – alexmngn

답변

1

나는이 정규식 포함이

/(0[19]|1[20]|2[31]|3[42]|4[53]|5[64]|6[75]|7[86]|8[97]|9[08])/ 
+0

예 : '4! = 2 + 1' 및'4! = 2-1 '이더라도'24 '입니다. 질문에 대한 의견보기 : '24'는 유효하지 않습니다. –

+0

이제 작동해야합니다 –

0

나는 확신 정규식 할 것도 해요 작업을해야한다고 생각합니다. 이 하나를 시도

function containsSequentialDigits(str) { 
    return /01|12|23|34|45|56|67|78|89|90|09|98|87|76|65|54|43|32|21|10/.test(str); 
} 

var s = [ 
    's', // false, no digits 
    '1x2', // false, no consecutive digits 
    '2x1', // false, dito 
    '13', // false, not "sequential" 
    '12', // true, increasing 
    '21', // true, decreasing 
]; 

for(var i = 0; i < s.length; i++) { 
    console.log(s[i], containsSequentialDigits(s[i])); 
} 

출력을 :

"s" false 
"1x2" false 
"2x1" false 
"13" false 
"12" true 
"21" true 
0

이 작업을 수행하는 가장 쉬운 방법은 연속적인 숫자의 간단한 문자열과 .indexOf() 방법이다. 문자열에 연속 숫자가 있는지, 아니면 연속 숫자가 가장 긴 그룹인지 또는 그와 같은 것이 있는지 (더 코딩하는 데 걸리는지) 여부 만 찾고 있다고 가정하면 다음 함수가 작동합니다 :

function hasConsecutiveDigits(sValue) { 
    var sConsecutiveDigits = ""; 
    var regDigitPattern = /\d{2,}/g; 

    var aDigitGroups = sValue.match(regDigitPattern); 

    if (aDigitGroups !== null) { 
     for (j = 0; j < aDigitGroups.length; j++) { 
      for (x = 0; x < (aDigitGroups[j].length - 1); x++) { 
       var sCurrDigits = aDigitGroups[j].substring(x, x + 2); 
       if (sConsecutiveDigits.indexOf(sCurrDigits) !== -1) { 
        return true;  
       } 
      } 
     } 
    } 

    return false; 
} 

sConsecutiveDigits 문자열이 가능한 연속 숫자 패턴이 모두 포함되어 있으므로 당신은 단순히 하나 개 이상의 숫자합니다 (regDigitPattern 정규식 값을 사용)의 그룹을 캡처하고 볼 수있는 경우에 그 중 두 자리 하위 그룹 그룹은 sConsecutiveDigits 문자열의 하위 문자열로 존재합니다.

또한 "예, 연속 숫자가 있습니다"또는 "아니요, 연속 숫자가 없습니다"만 찾고 있기 때문에 일치 항목을 찾자마자 수표를 끝내고 조금 처리.

var aTestData = ["ae12", "aeg12345km", "mea65", "ab2d43a21", "poe09ac", "adsas", "asd13sad", "asda1357sd", "sd4dfg3dfg5df"]; 

for (i = 0; i < aTestData.length; i++) { 
    var result = hasConsecutiveDigits(aTestData[i]); 

    console.log("'" + aTestData[i] + "' " + ((result) ? "contains" : "does not contain") + " consecutive digits.") 
} 

:

나는 다음과 같은 코드를 사용하여 기능을 테스트했다. . . 좀 내 솔루션에 속도 테스트 여기 Daniel Böhmer 's의 실행

'ae12' contains consecutive digits. 
'aeg12345km' contains consecutive digits. 
'mea65' contains consecutive digits. 
'ab2d43a21' contains consecutive digits. 
'poe09ac' contains consecutive digits. 
'adsas' does not contain consecutive digits. 
'asd13sad' does not contain consecutive digits. 
'asda1357sd' does not contain consecutive digits. 
'sd4dfg3dfg5df' does not contain consecutive digits. 

UPDATE : 다음과 같은 결과를 받았다 http://jsperf.com/duplicate-digit-check

긴 이야기, 짧은, 그들은 걸쳐 매우 유사하게 수행 대부분의 경우 indexOf 접근 방식에 약간의 우위를두고 테스트 한 3 명의 전문가 (IE 9, FF 31 및 Chrome 40)입니다.

사실 모든 코드가 단일 정규식 검사로 fas로 실행된다는 사실은 정규식이 얼마나 무거울 수 있는지에 대한 아이디어를 제공합니다. 훌륭한 도구이지만 "부드럽게"사용해야합니다. :)

+0

좋은 설명. 하지만 왜 정규식에 매치 할 때이 복잡한 접근법으로 충분합니까? 장점이 있습니까? 속도 비교가 있습니까? –

+0

기본적으로 두 가지 이유가있었습니다 : (1) 정규 표현식이 굉장한 것처럼, "프로세스가 무거웠습니다"(하지만 아직이 솔루션을 테스트 할 수있는 기회가 없었습니다) 및 (2) 문자열 접근법은 동일한 솔루션을 제공하는 데 필요한 상당히 복잡한 정규식 패턴보다 읽기 쉽고 유지 관리가 쉽습니다. 기회가 생기면 성능을 점검 할 것입니다. – talemyn

+0

@ DanielBöhmer - 스피드 테스트가 추가되었습니다. – talemyn