2010-08-05 12 views

Antwort

31

Es gibt eine große Vergleichstabelle in http://www.regular-expressions.info/refflavors.html.


meisten grundlegenden Elemente sind die gleichen, die Unterschiede sind:

Geringfügige Unterschiede:

  • Unicode-Escape-Sequenzen. In .NET ist es \u200A, in Perl ist es \x{200A}.
  • \v in .NET ist nur die vertikale Registerkarte (U + 000B), in Perl steht es für die "vertikale Whitespace" -Klasse. Natürlich gibt es dafür in Perl \V.
  • Der Bedingungsausdruck für benannte Referenz in .NET ist (?(name)yes|no), aber (?(<name>)yes|no) in Perl.

Einige Elemente sind Perl-only:

  • Possessive Quantoren (x?+, x*+, x++ usw.). Verwenden Sie stattdessen einen nicht zurückverfolgenden Unterausdruck ((?>…)).
  • Benannte Unicode-Escape-Sequenz \N{LATIN SMALL LETTER X}, \N{U+200A}.
  • Fall Falten und
    • \l (Kleinbuchstaben nächsten char), \u (Großbuchstaben neben char) entweicht.
    • \L (Kleinbuchstaben), \U (Großbuchstaben), \Q (Anführungszeichen) bis \E.
  • Kurzschreibweise für Unicode-Eigenschaft \pL und \PL. Sie müssen die geschweiften Klammern in .NET, z. \p{L}.
  • Seltsame Dinge wie \X, \C.
  • Sonderzeichenklassen wie \v, \V, \h, \H, \N, \R
  • Rückverweis auf eine bestimmte oder vorherige Gruppe \g1, \g{-1}. Sie können den absoluten Gruppenindex nur in .NET verwenden.
  • Benannte Rückreferenz \g{name}. Verwenden Sie stattdessen \k<name>.
  • POSIX-Zeichenklasse [[:alpha:]].
  • Abzweig-Reset-Muster (?|…)
  • \K. Verwenden Sie stattdessen Look-Behind ((?<=…)).
  • Codebewertungserklärung (?{…}), Post-poned Teilausdruck (??{…}).
  • Subexpression Referenz (recursive-Muster) (?0), (?R), (?1), (?-1), (?+1), (?&name).
  • Some Prädikat des bedingten Ausdruck sind Perl-spezifisch:
    • Code (?{…})
    • rekursive (R), (R1), (R&name)
    • (DEFINE) definieren.
  • Spezielle Backtracking Steuer Verb (*VERB:ARG)
  • Python Syntax
    • (?P<name>…). Verwenden Sie stattdessen (?<name>…).
    • (?P=name). Verwenden Sie stattdessen \k<name>.
    • (?P>name). Keine Entsprechung in .NET.

Einige Elemente sind .NET nur:

  • variabler Länge Blick hinter. Verwenden Sie stattdessen in Perl für positiven Look-back \K.
  • Beliebiger regulärer Ausdruck in Bedingungsausdruck (?(pattern)yes|no).
  • Zeichenklassensubtraktion (undokumentiert?) [a-z-[d-w]]
  • Auswuchtgruppe (?<-name>…). Dies könnte mit der Codeauswertungsaussage (?{…}) gefolgt von einer (?&name) simuliert werden.

Referenzen:

+3

+1 Große Antwort –

+0

Awesome, thanks ... BTW, ich war ziemlich angenehm überrascht, wie kompatibel die 2 Dialekte sind ... sogar Umschau usw. Ich hatte auch nicht gewusst, dass die Regex.Replace-Methode in .NET unterstützte das Ersetzen passender eingeklammerter Teilausdrücke ($ 1, $ 2 usw.) wie folgt: str = Regex.Replace (str, @ "([az] +): (\ d +)", m => m.Result ("$ 1 - $ 2 ")) was dem Perl entspricht: s/([az] +): (\ d +)/$ 1 - $ 2/g – JoelFan

+0

" Einige Elemente sind nur Perl "erwähnt keine Zeichenumsetzung (wie tr/tgca/acgt /), so wird es unterstützt, oder? – mbx

2

Sie waren designed to be compatible mit Perl 5 Regexes. Perl 5 regexes sollte nur in .NET arbeiten.

Sie können einige RegexOptions übersetzen:

[Flags] 
public enum RegexOptions 
{ 
    Compiled = 8, 
    CultureInvariant = 0x200, 
    ECMAScript = 0x100, 
    ExplicitCapture = 4, 
    IgnoreCase = 1,     // i in Perl 
    IgnorePatternWhitespace = 0x20, // x in Perl 
    Multiline = 2,     // m in Perl 
    None = 0, 
    RightToLeft = 0x40, 
    Singleline = 0x10    // s in Perl 
} 

Ein weiterer Tipp wörtlich Strings zu verwenden ist, so dass Sie nicht diese alle Escape-Zeichen in C# entkommen müssen:

string badOnTheEyesRx = "\\d{4}/\\d{2}/\\d{2}"; 
string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}"; 
+0

Ich bin kein Experte in .NET, aber ich würde um, dass sein andersrum vorstellen ... –

+3

@Eric: Weder ist eine Obermenge der anderen. – kennytm

+1

Nein, .NET kam nach Perl 5 und kopierte seine gewinnende Regex-Syntax. –

1

Es hängt wirklich von der Komplexität des regulären Ausdrucks ab - viele funktionieren nach dem Auspacken gleich.

Werfen Sie einen Blick auf this .NET Regex Spickzettel, um zu sehen, ob ein Operator tut, was Sie erwarten, es zu tun.

Ich kenne kein Tool, das automatisch zwischen RegEx-Dialekten übersetzt.

+0

RegexBuddy kann eine Regex in einer Vielzahl von Aromen und konvertieren sie in eine andere - solange die erforderliche Funktionalität von der Ziel Regex Geschmack unterstützt wird . –