2011-09-12 3 views
2

"catdogbirdbirdcat"과 같은 문자열이 있다고 가정 해보십시오. "고양이"가 정확히 두 번 발생하고 "개"가 정확히 한 번 발생 하는지를 결정하는 가장 좋은 방법은 무엇입니까?두 개의 서로 다른 단어가 문자열에 나타나는 횟수 계산 - 하나의 정규식으로 가능합니까?

(cat|dog) 

문자열을이 정규 표현식과 비교하고 배열을 가져와 일치하는 요소를 셀 수 있습니다. 또는 우리는 두 개의 별개의 정규식을 사용할 수 있습니다. 하나는 고양이를위한 것이고 다른 하나는 새를위한 것입니다.

하나의 정규식을 사용하여이 작업을 한 번에 수행 할 수 있습니까?

답변

3

글쎄, 나는 그것이 최선의 방법인지, 그리고 그것은 꽤 추한 것입니다. 그러나 다음과 같은 한 가지 방법이 있습니다.

/ 
^    #The start of the string. 
(?=     #A non-capturing lookaround. 
        #so that you can check both conditions. 
    (?:    #A non-capturing group. 
     (?:(?!cat).)* #Capture text, that doesn't have cat included. 
     cat   #Check for the text cat 
     (?:(?!cat).)* #See above. 
    ){2}    #Two of these 
    $    #The end of the string. 
) 
    (?=    #Then do the same for dog 
    (?:(?!dog).)* 
    dog 
    (?:(?!dog).)* 
    $ 
)     #Only one dog though. 
/x     #The x flag just means ignore whitespace for readability. 
        #You can also do this though: 

/^(?=(?:(?:(?!cat).)*cat(?:(?!cat).)*){2}$)(?=(?:(?!dog).)*dog(?:(?!dog).)*$)/ 
+0

휴! 그런 식으로 넣을 때 (cat | dog)의 일치를 계산하는 것이 훨씬 간단합니다. 감사. 그냥 내가 뭔가 확실한 것을 놓치지 않았는지 확인하고 싶었습니다. –

1

음 ... 다른 사람이이 방법을 사용할 수 있습니다 ... 집에 가야합니다. 그러나 어쨌든, 이것은 내가 그것을 할 수있는 방법입니다.

var ar = "catdogbirdbirdcat".match(/(cat|dog|bird)/g).sort() 
var i = 0; 
while(ar[ar.lastIndexOf(ar[i])] != undefined) { 
    i = ar.lastIndexOf(ar[i]); 
    //somehow get it in an object 
    console.log(ar[i] + " " + (i - ar.indexOf(ar[i]) + 1)); 
    i++; 
} 
관련 문제