2012-02-13 15 views
0

現在、任意の空白を含む特定の単語に一致する正規表現パターンがあります。Javaの正規表現で単語の連続する繰り返しを数える

単語が "the"の場合、私のパターンは "t h e"と "the"と一致します

私の質問は、の連続した番号を数えて追跡する方法はありますか? 私は単語の連続した反復の最大量を返すことを探しています。

私の文字列が

「速い茶色のキツネのthetheが...上thethetheを跳び」された場合、私は私の方法は、3を返すようにしたいでしょう、7は、発生回数の合計を数えていないことは非常に簡単です:

Pattern p = Pattern.compile("(t\\s*h\\s*e\\s*)"); 
Matcher m = p.matcher(s); 

while(m.find()) { 
    count++; 
} 

私は連続した繰り返しの最大数を返したいと思います。 正規表現でこれを行う方法があるかどうか不思議です。

+0

正規表現には数える能力がないので、 "ユニークなコマンド"の方法ではできません。カウントのためには、より強力な言語が必要です。あなたは同意するか、私は何かを逃していますか? –

+0

はい私は同意します。私は、表現が「数える」のであれば、それは「規則的」ではないと思います。 –

+0

@VanDarg: 'the'の2回の反復があるので、出力を' 2'にします。 – RanRag

答えて

0

私は賢明な解決策を考え出したと信じて:

// Possible values for n: 
// (t\\s*h\\s*e\\s*){1} 
// (t\\s*h\\s*e\\s*){2} 
// (t\\s*h\\s*e\\s*){3}... 
public int consecutiveThe(String s) { 
    int n = 0; 
    while(true) { 
     String expression = "(t\\s*h\\s*e\\s*){" + n + "}"; 
     Pattern p = Pattern.compile(expression); 
     Matcher m = p.matcher(s); 
     if(!m.find()) { 
      break; 
     } 
     n++; 
    } 
    return (n - 1); 
} 

アイデアは、正規表現の一致があるかどうかをチェックする、n個の連続した値をループしています。一致しないnの値が得られると、直前にシーケンス内で一致した数値を返します。

0

これはテストされていませんが、私はロジックが健全だと信じています。すべての位置と長さに対して1つのエラーでオフを確認してください。

次に、シーケンスをループして最大シーケンスを見つけることができます。あなたのパターンに末尾の\s*を残しておいてください。

他の方法では、パターン"(t\\s*h\\s*e\\s*)*"の複数形を使用して、一致するものをループして、取り込まれた文字列を抽出することができます。そのキャプチャされた文字列で特異正規表現"(t\\s*h\\s*e\\s*)"を実行し、隣にいることがわかっているのでwhile(m.find()) count++;を実行してください。

関連する問題