2009-04-03 8 views
4

Eine C# -Anwendung, die meine Firma verwendet, verwendet reguläre Ausdrücke aus einer Datenbanktabelle und vergleicht sie mit verschiedenen Textdateien. Das Problem ist, dass die Anwendung keine RegexOptions als Standard eingestellt hat und ich den Modus "Punkt entspricht neuer Zeile" verwenden muss.Unterstützt das .NET-Modul für reguläre Ausdrücke Inline-Modusmodifikatoren?

Ist die Motorunterstützung Inline-Modus-Modifikatoren wie wie

"A(?s)(.*?)(?-s)B" 

oder "global" Modus-Modifikatoren wie in PHP

"/A(.*?)B/s" 

Antwort

1

Ja. Siehe here.

(?s:) 

Sollte Single-Line-Modus einschalten.

2

Sicher es (unterstützt Inline-Modus Modifikatoren)!

Verwenden Sie einfach den Modusmodifikator (?s:), um den "SingleLine-Modus" einzuschalten, bei dem das Punktzeichen mit Zeilenumbrüchen übereinstimmt.

Um zu überprüfen, wie ein Regulärer Ausdruck im .NET-Flavour funktionieren würde, finde ich es praktisch, das RAD Regex Designer zu verwenden, das die .NET Regex-Engine verwendet.

+0

Ich mag mehr regexbuddy :) – knoopx

+0

Ja, tue ich auch, aber Regexbuddy unterstützt dann alle Regex Aromen und Funktionen. – Cerebrus

3

Neben dem RegexOptions Compiler-Flags, gibt es keine direkte Entsprechung für den /s Stil Modifikator, aber Sie können, indem Sie einen Inline-Modifikator gleich am Anfang Ihrer regex den gleichen Effekt:

"(?s)A(.*?)B" 

Be Beachten Sie, dass es zwei Formen des Inline-Modifikators gibt. Der in Ihrem Beispiel verwendete:

"A(?s)(.*?)(?-s)B" 

... hat keinen Doppelpunkt. Der (?s) ist lediglich ein Schalter, der den DOTALL-Modus einschaltet, bis der ihn wieder ausschaltet. Die andere Version, mit dem Doppelpunkt, ist eigentlich eine nicht einfangende Gruppe, (?:...), mit dem eingebauten Modus-Schalter. Der Modus-Schalter hat nur Wirkung, während der Teil des Regex innerhalb dieser Gruppe die Kontrolle hat. Mit dieser Version würde Ihr Beispiel

"A(?s:.*?)B" 

werden ... oder, wenn Sie noch eine Erfassungsgruppe verwenden wollte:

"A(?s:(.*?))B" 

Sie wollen nicht mischen die beiden Versionen. Wenn Sie sind Ihre ursprünglichen Regex wie folgt schreiben:

"A(?s:)(.*?)(?-s:)B" 

... wäre es nicht eine Ausnahme auslösen, aber es wäre nicht wie vorgesehen. Die (?s:) würde im DOTALL-Modus einfach nichts entsprechen, und die (?-s:) würde im Nicht-DOTALL-Modus mit etwas mehr nichts übereinstimmen.

+0

Ahhh, die Geheimnisse von Regex! – Cheeso