2011-09-12 2 views
2

「catdogbirdbirdcat」のような文字列があるとします。 「猫」が正確に2回発生し、「犬」が1回発生するかどうかを判断する最も良い方法は何ですか?2つの異なる単語が文字列に現れる回数を数えます - 1つの正規表現で可能ですか?

(cat|dog) 

文字列をこの正規表現と照合して、配列を取得して一致する要素を数えます。あるいは、猫用と鳥用の2つの別々の正規表現を行い、そこから行くことができます。

これを1回の正規表現ですべて実行する方法はありますか?

答えて

3

これが最良の方法であるかどうかはわかりません。かなり醜いです。しかし、ここには1つの方法があります:

/ 
^    #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

Whew!そのようにすると、(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++; 
} 
関連する問題