2011-12-23 9 views
1

私はC#でWinFormsでNET 2.0を使用しています。私は正規表現に大きな問題を抱えています。私は単純な文字列で4つ以上の文字の単語にコロンを追加しようとしています。コロンを一度追加するだけです。それ以降、コードはそれ以上追加されません。C#regex - 文字列に一致しません

Regex lbls = new Regex(@"^\s*(?<lbl>[A-Za-z0-9_]{4,})", RegexOptions.Multiline); // Use a regex to obtain all 4 letter words in string 
MatchCollection matches = lbls.Matches(text); // text is my string 

foreach (Match m in matches) 
{ 
    string mm = m.Groups["lbl"].Value; // Matches are stored in this group. 
    if (!Regex.IsMatch(text, @"^\s*\b" + mm + @":\b", RegexOptions.Multiline)) 
    { 
    text = Regex.Replace(text, @"\b" + mm + @"\b", mm + ":", RegexOptions.Multiline); 
    } 
} 

文字列が「テスト」であるとします。つまり、出力は「TEST:」でなければなりません。しかし、コードがもう一度実行されると、テキストは "TEST:"のままでなければなりませんが、代わりに "TEST ::"になります。コロンが追加され続ける。どうしてこれなの?私のifステートメントが完全に正しいように見えます。

答えて

1

コードを初めて実行するときは、入力(単に「テスト」)の値「TEST」を検索し、それを「テスト」に置き換えて最後にコロンを追加します。

したがって、最初の反復後、結果は "TEST:"になります。

コードを2回目に実行すると、入力(現在は「TEST:」)の値「TEST」を探して「TEST」に置き換え、最後にコロンを追加します。

2回目の反復後、結果は "TEST ::"になります。

コロンがない(たぶん?)場合にのみ、コロンを最後に追加したいと思うようです。これに行...

if (!Regex.IsMatch(text , @"\b" + mm + @"\b:" , RegexOptions.Multiline)) 
+0

はい、私は混乱しています。問題はどこだ?また、 "TEST"ではなく、最初の反復で "TEST:"という値を検索しませんか?検索にもコロンがあります。 – david

+0

あなたのコメントに答えるために私の答えを更新しました。私はあなたのIFステートメントのコロンを動かすと、あなたが必要なものを手に入れることができると信じています。 –

+0

ええ、それはそれを修正し、私は今問題を見る。私は次のように置いた:外側の代わりに、単語の境界内に、ばかげた間違い。それを指摘してくれてありがとう。 – david

2

^([A-Za-z0-9_]{4})(?!:)$1:と交換してください。$1が最初のグループです。

+0

"場合"

はあなたを変更してみてください?あなたが何を意味するのかはっきりしない。 – david

+0

正規表現は、入力の先頭から4文字の英数字を照合し、それらをキャプチャし、その後ろに列がないことを確認します。 – fge

関連する問題