2009-05-06 44 views
1

私は正規表現$ anchorを.netフレームワークを使ってテストしようとしますが、その結果は予想外です。 $アンカーは、最後のアンカーのみを返します。マルチラインスイッチは重要であり、私はすでにここでそれを使用しています。誰でもその理由を伝えることができます。以下の私のテストコードは

おかげ フレッド

 string sourceText = 
@"ab<br /> 
ab<br /> 
ab"; 

     //var m = Regex.Match(sourceText, "^a", RegexOptions.Multiline); //this return 3 match 
     var m = Regex.Match(sourceText, "b$", RegexOptions.Multiline); //this return only one match 
     while (m.Success) 
     { 
      Console.Write(m.Value); 
      m = m.NextMatch(); 
     } 

答えて

4

$試合だけ\n、ない\r\n(Windowsのテキストファイル内のリテラルC#を使用する場合、あなたの文字列のように)です。

正規表現b(?=\r?$)は、あなたが期待することを行います。

説明はhttp://msdn.microsoft.com/en-us/library/h5181w5w.aspxを参照してください。

0

これが機能しない理由は2つあります。 Luceroによると、一致する$は改行にのみ一致し、テスト文字列には各行の末尾に改行と改行があります。 2番目の理由は、行の最後にbをマッチさせようとしており、テスト文字列にはこの要件に一致する行が1つしかなく、最初の2行は>で終わります。私はあなたが欲しい疑う何

は、より多くのこのようなものです:

b(?=(?:<br />)?\r?$) 
0

あなたが正規表現を適用している正確に何についてのいくつかのcoufusionがあるようです。あなたの元の投稿に現れた方法では、文字列リテラルにはリテラルの改行が入っていて(コンパイルされていてはいけません)、SOソフトウェアは<BR>タグに置き換えられました。あなたは改行が含まれている文字列をしたい場合は、そのように、適切なエスケープシーケンスを使用する必要があります。いずれの場合も

string sourceText = "ab\nab\nab"; 

または

string sourceText = "ab\r\nab\r\nab"; 

を、正規表現b$すべての3つのBさんと一致する必要がありますマルチラインモードで適用されます。私はそれ自身でテストするようには設定されていませんが、もし$が実際に\nの前にマッチすれば、MSDN articleと言います。それは.NET regexesの重大な欠陥とみなされます。 \r\nシーケンスが与えられた場合、$\rの前に一致し、\nの前に一致しません。