2011-07-06 12 views
1

問題の解決策を見つけようとしています。私は、次のC#のコードを実行した場合:C#.NET Regexの問題

Regex r = new Regex("[\\r\\n]*"); 
Match m = r.Match("\\r\\n"); 

を私はm.Successの値を調べると、私が正しいとする、真の値を取得します。しかし、m.Lengthの値を調べると、0という値が得られます。 m.Valueを調べると、空白値も得られます。私は正規表現で何かを見逃していますか?私は、m.Successのいずれかが偽である必要があり、m.Lengthが0であるか、またはm.Successが真である必要があり、m.Lengthが0より大きい必要があるという印象を受けています。

+0

第2行は 'Match m = r.Match(" \ r \ n ");'にしてはいけません。私はこれがエスケープされていない、実際のcr/lf文字の文字列だと思いますか? –

+0

あなたが「\」を除外すれば、それは仕事をします...しかし、それが意図されているものかどうかはわかりません... – Flawless

答えて

6

MatchSuccessはRegexが "\ r"または "\ n"の "0以上の"インスタンス、つまりキャリッジリターンまたはラインフィード( "*"シンボル)。ただし、あなたが指定した文字列(Match内)には、代わりに改行でも改行でもないバックスラッシュ、r、バックスラッシュ、nが含まれているので、一致の長さは0です。 (正規表現内では、 "バックスラッシュ、n"は1文字の改行として扱われます)。

このように、おそらく正規表現でどのようにバックスラッシュの仕事でいくつかの混乱を避けるため、「@」記号で正規表現を前置してみてください、将来の更なる混乱を避けるために:

@"[\r\n]*" 

うまくいけば、これが作ります"\ r"は復帰を意味し、改行は "\ n"を意味します。関連正規表現:

@"[\\rn]*" 

は、0個以上のバックスラッシュ、r、および/またはn個のインスタンスと一致します。 (記号が正規表現で特別に扱われるので、二重のバックスラッシュが必要です。)

+0

私はこのような失敗をしています。ありがとうピーター – Icemanind