2014-11-24 6 views
-1

제목을 검색하여 몇 가지 해결책을 찾았지만 어느 것도 나를 위해 일하지 않았습니다. 다음과 같은 것을 원합니다.주어진 문자열 내의 문자열 반복 확인

checkRepeat('ccc','cc'); // should give output 2 
checkRepeat('cccaacddcccc','cc'); // should give output 5 

등등. 이걸 도와주세요.

나는 시도했다 :

function checkRepeat(string, search) { 
    if (!search.length) return 0; 
    var pattern = new RegExp('(' + search + ')', 'ig'), 
     match = string.match(pattern), 
     parts = string.split(pattern).slice().filter(function (i) { 
      return i.length; 
     }); 
    console.log(match.length); 
    console.log(parts.length - 1); 
} 
+6

그리고 [시도한 내용] (http://mattgemmell.com/what-have-you-tried/) 코드는 어디에 있습니까? – zzzzBov

+0

'checkRepeat ('cccaacddcccc', '')는 각 문자 사이에 "발생"하기 때문에 13을 반환해야합니다. 그건 그렇고, 당신이 중첩되는 일치를 찾고 있기 때문에, 정규 표현식이 이것을 위해 작동 할 가능성은 희박합니다. 당신의 솔루션이 어떻게 작동하지 않습니까? @ Begueradj Downvotes는 "gimme-some-code"질문에 대해 비합리적인 것은 아니며 담당자가 무엇이든 상관 없습니다. –

+3

@Begueradj 위/아래 투표는 평판과는 관련이 없지만 질문의 질을 반영해야합니다. – Nit

답변

1

이 시도 :

function checkRepeat(f, s, o) { 
    return (f.length && s.length) 
      ? f.match(new RegExp((o || (undefined === o)) ? '(?=(' + s + '))' : f, 'g')).length 
      : 0; 
} 

이 솔루션은 귀하의 질문에 결합이 comment.

2

재귀가 사용자의 요구에 맞게 수 :

// from http://stackoverflow.com/a/646643/1225328 
function startWith(str, sub) { 
    return str.slice(0, sub.length) === sub; 
} 

function checkRepeat(str, sub) { 
    // stop recursion when "str" or "sub" is empty 
    if (!sub.length || !str.length) { 
     return 0; 
    } 
    // recursion on "str" minus its first char 
    return (startWith(str, sub) ? 1 : 0) + checkRepeat(str.slice(1), sub); 
} 

반복적 인 솔루션 :

function checkRepeat(str, sub) { 
    if (!sub.length) { 
     return 0; 
    } 
    var n = sub.length; 
    var count = 0; 
    for (var i = 0; i <= str.length - n; i++) { 
     if (str.slice(i, i + n) === sub) { 
      count++; 
     } 
    } 
    return count; 
} 
+0

이것은 재귀 적 방법이 아닌 단순한 루프로 훨씬 더 합리적입니다. – Nit

+0

'startWith'의 최적 구현은'str.indexOf (sub) === 0'입니다. 또한 사람들을 혼동하고 싶다면'? ': 0'은 부울 값이 추가 될 때 캐스팅되기 때문입니다. –

+1

이 솔루션은 꽤 우아하지만 느린 편이어서 매우 긴 문자열에 대해서는 스택을 날려 버릴 수 있습니다. – helpermethod

0

이것은 정규식을 수행해야합니다

function checkRepeat(string, search) { 
    if (!search.length) return 0; 
    var myRe = new RegExp(search, 'g'); 
    var count = 0; 
    while (myRe.exec(string) !== null) { 
     count++; 
     myRe.lastIndex -= search.length-1; 
    } 
    return count; 
} 
alert(checkRepeat('ccc', 'cc')); // 2 
alert(checkRepeat('cccaacddcccc', 'cc')); // 5 

http://jsfiddle.net/xfmL6w59/