2009-05-06 13 views
1

Ich versuche, reguläre Ausdruck $ Anker mit .NET Framework zu testen, ist das Ergebnis unerwartet. Der $ Anker gibt nur den letzten zurück. Ich merke, dass der Multiline-Schalter wichtig ist, und ich habe ihn bereits hier benutzt. Kann jemand den Grund sagen. Im Anschluss ist mein Testcode

Dank Fred

 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(); 
     } 

Antwort

0

Es gibt zwei Gründe, warum dies nicht funktioniert. Wie Lucero sagt, stimmt die Übereinstimmung von $ nur mit einem Zeilenvorschub überein, und Ihre Testzeichenfolge hat eine Zeilenumbruch-Funktion sowie einen Zeilenvorschub am Ende jeder Zeile. Der zweite Grund ist, dass Sie versuchen, b am Ende einer Zeile zu finden, und Ihre Testzeichenfolge hat nur eine Zeile, die dieser Anforderung entspricht, die ersten beiden Zeilen enden mit>.

Was ich vermute, Sie wollen, ist etwas mehr wie folgt aus:

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

Es scheint eine gewisse coufusion zu sein, was genau sind Sie die Regex zu Anwendung. Wie es in Ihrem ursprünglichen Post erschienen ist, schien das String-Literal wörtliche Zeilenumbrüche zu enthalten (die nicht einmal kompiliert sein sollten), die die SO-Software durch <BR> Tags ersetzt hat. Wenn Sie eine Zeichenfolge enthält Zeilenumbrüche wollen, müssen Sie die entsprechenden Escape-Sequenzen verwenden, etwa so:

string sourceText = "ab\nab\nab"; 

oder

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

In jedem Fall der Regex b$sollte Spiel alle drei bs wenn im Multiline-Modus angewendet. Ich bin nicht eingerichtet, um es selbst zu testen, aber wenn $ wirklich nur vor \n als das MSDN article sagt, würde ich es als einen ernsthaften Fehler in .NET-Regex betrachten. Bei einer \r\n Sequenz sollte $ vor der \r und nicht vor der \n übereinstimmen.