2012-01-10 16 views
2

文字列があるとします:特定のパターンまでの文字列の一致

"hello world; some random text; foo;"

どのようにして ';'私がすべき最初の試合をしたい他の言葉で

:私が試してみました"hello world"

第二試合は" some random text"

ことにするなど

もの:

string s = "hello world; some random text; foo;"; 
Regex r = new Regex(".+?;"); 
var match = r.Match(s); 

while(match.Success) 
{ 
    Console.WriteLine(match.Value.ToString()); 
    // first match is "hello world"!! but this turns out to be an infinite loop 
    match.NextMatch(); 
} 

I私はRegex.Split()メソッドを使うことができると知っていますが、私はこのテクニックを使いたいと思います...私は間違って何をしていますか?なぜmatch.NextMatch();メソッドは次の一致を返しませんか?

+0

*「私は 'Regex.Split()'メソッドを使用することができます知っているが、私はinteadこのテクニックを使いたい」* - なぜそう...、それがあなたが必要とするものを、おそらくホイールを再発明するよりも効率的に行うならば? – Yuck

+1

「私は間違っていますか?」あなたは間違ったテクニックを使用しています。 'Regex.Split'を使います。あるいは、この単純な例では 'string.Split'を使うだけです。 – vcsjones

+0

私は複数の一致を見つけるために、より長い正規表現を作成しているためです。私はこの問題のために私の正規表現の真ん中に立ち往生しています... –

答えて

5

Iだろう強くは、あなたもstring.Splitは、この単純な例のために示されている、またはとしてあなたがRegex.Splitを使用することをお勧めします。

しかし、あなたはまだループ何らかの理由を使用したい場合、あなたはこのような何かを行うことができます:

string s = "hello world; some random text; foo;"; 
Regex r = new Regex(".+?;"); 
for (Match m = r.Match(s); m.Success; m = m.NextMatch()) 
{ 
    Console.WriteLine(m.Value); 
} 

あなたの具体的な例の問題点は、NextMatch新しい試合を返すことです。現在のマッチは変更されません。 whileループ内のmatch.NextMatch();からmatch = match.NextMatch();を変更すると解決されます。

0

この問題を修正するように見えた:

string s = "hello world; some random text; foo;"; 
Regex r = new Regex(".*?;{1}"); 
var match = r.Match(s); 

while(match.Success) 
{ 
    Console.WriteLine(match.Value.ToString()); 
    // move match index to avoid getting the same match 
    match = r.Match(s, match.Index + match.Length); 
} 
関連する問題