2010-11-22 2 views
0

Ich habe folgende Regex in C#:Warum passt mein C# Regulärer Ausdruck nicht zwischen Zeilen?

Regex h1Separator = new Regex(@"<h1>(?'name'[\w\d\s]+?)(<br\s?/?>)?</h1>", RegexOptions.Singleline); 

Der Versuch, eine Zeichenfolge übereinstimmen, die wie folgt aussieht:

<h1>test content<br> 
</h1> 

jetzt es Strings übereinstimmt, die wie folgt aussehen:

<h1>test content<br></h1> 
<h1>test content</h1> 

Was mache ich falsch? Sollte ich für einen Newline-Charakter passen? Wenn ja, was ist das in C#? Ich kann keinen finden.

Antwort

4

Zwischen dem Ende des br-Tags und dem Anfang des nächsten Tags wird nicht nach Leerzeichen gesucht. Daher wird unmittelbar danach das hr-Tag angezeigt. Fügen Sie ein \ s * hinzu, um dies zu ermöglichen.

0

Das Zeilenvorschubzeichen in C# lautet: \n. Ich bin jedoch nicht mit Regex vertraut und konnte Ihnen nicht sagen, was passieren würde, wenn in einem Regex-Ausdruck eine neue Zeile enthalten wäre.

1

Sie haben es als eine einzige Zeile Regex definiert, siehe die RegexOptions.Singleline Flags verwenden :) RegexOptions.Multiline

+0

Ich denke, ich hätte gesagt, aber keine der beiden Optionen funktioniert. Irgendeine Chance, dass etwas mit der Regex selbst nicht stimmt? –

+4

Singeline steuert nur das Verhalten des. Element (ob es zu allem oder zu allem passt, außer Newline). Er benutzt das nicht. Element in seiner Regex, so sollte es nichts ändern. – MikeP

+2

und Multiline nur "Ändert die Bedeutung von^und $ so, dass sie am Anfang und am Ende jeder Zeile übereinstimmen, nicht nur am Anfang und am Ende der ganzen Zeichenfolge." (von MSDN). Anscheinend gibt es eine Menge Verwirrung über diese beiden RegEx-Optionen. –

-1

den Multiline-Flag verwenden. (Bearbeiten Sie, um meine falsche Meinung über die .Net-Plattform anzusprechen).

Der Singleline-Modus behandelt die gesamte Zeichenfolge, die Sie übergeben, als einen Eintrag. Daher stellen ^ und $ die gesamte Zeichenfolge und nicht den Anfang und das Ende einer Zeile innerhalb der Zeichenfolge dar. Beispiel <h1>(?'name'[\w\d\s]+?)(<br\s?/?>)?</h1> wird dieses Spiel:

<h1>test content<br></h1> 

mehrzeilige Modus ändert die Bedeutung von ^ und $ zu Beginn und Ende jeder Zeile innerhalb der Zeichenfolge (das heißt, sie bei jedem Zeilenumbruch aussehen wird).

Regex h1Separator = new Regex(@"<h1>(?'name'[\w\d\s]+?)$(<br\s?/?>)?</h1>", RegexOptions.Multiline); 

wird das gewünschte Muster entsprechen:

<h1>test content<br> 
</h1> 

Kurz gesagt, müssen Sie den regulären Ausdruck Parser Sie mit mehreren Linien erwarten sagen, zu arbeiten. Es hilft, einen Regex-Designer zu haben, der Ihren Regex-Dialekt spricht. Da sind viele.

+0

Dies ist nicht wahr. Weitere Informationen finden Sie in der Dokumentation zu RegexOptions.SingleLine. – MikeP

+0

Das ist nicht wahr. werfen Sie einen Blick in die [MSDN-Dokumentation] (http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx) –

+0

Dies ist, wo Sie auf mehreren Plattformen arbeiten. Das OP muss weiterhin das Multiline-Flag verwenden und das '$' an das Ende der ersten Zeile in der Regex einfügen. –

0

können Sie entweder einen Punkt . auf Ihre Zeichenfolge vor der Endung </h1> hinzuzufügen und so die RegexOptions.Singleline Option, oder es zu RegexOptions.Multiline ändern und eine $ auf die regex vor dem </h1> hinzuzufügen. Details here