2010-08-05 9 views

risposta

31

C'è una grande tabella di confronto in http://www.regular-expressions.info/refflavors.html.


La maggior parte degli elementi di base sono gli stessi, le differenze sono:

differenze minori:

  • Unicode sequenze di escape. In .NET è \u200A, in Perl è \x{200A}.
  • \v in .NET è solo la scheda verticale (U + 000B), in Perl indica la classe "spazi bianchi verticali". Ovviamente c'è lo \V in Perl a causa di questo.
  • L'espressione condizionale per il riferimento denominato in .NET è (?(name)yes|no), ma (?(<name>)yes|no) in Perl.

Alcuni elementi sono Perl-only:

  • quantificatori possessivi (x?+, x*+, x++ ecc). Utilizzare invece la sottoespressione senza backtracking ((?>…)).
  • Sequenza di escape unicode denominata \N{LATIN SMALL LETTER X}, \N{U+200A}.
  • cassa pieghevole e fuggire
    • \l (minuscolo carattere successivo), \u (maiuscolo carattere successivo).
    • \L (lettere minuscole), \U (lettere maiuscole), \Q (virgolette caratteri) fino a \E.
  • notazione abbreviata per Unicode proprietà \pL e \PL. Devi includere le parentesi in. NET ad es. \p{L}.
  • cose strane come \X, \C.
  • classi di personaggi speciali come \v, \V, \h, \H, \N, \R
  • backreference a un gruppo specifico o precedente \g1, \g{-1}. È possibile utilizzare solo l'indice di gruppo assoluto in .NET.
  • nome backreference \g{name}. Utilizzare invece \k<name>.
  • Classe carattere POSIX [[:alpha:]].
  • Pattern di derivazione (?|…)
  • \K. Utilizzare invece look-behind ((?<=…)).
  • codice di valutazione affermazione (?{…}), subexpression post-poned (??{…}).
  • riferimento subexpression (schema ricorsivo) (?0), (?R), (?1), (?-1), (?+1), (?&name).
  • predicato Alcuni di espressioni condizionali sono Perl-specifica:
    • codice (?{…})
    • ricorsiva (R), (R1), (R&name)
    • definire (DEFINE).
  • speciali backtracking controllo verbi (*VERB:ARG)
  • Python sintassi
    • (?P<name>…). Utilizzare invece (?<name>…).
    • (?P=name). Utilizzare invece \k<name>.
    • (?P>name). Nessun equivalente in .NET.

Alcuni elementi sono NET solo:

  • lunghezza variabile look-dietro. In Perl, per uno sguardo positivo, usa invece \K.
  • Espressione regolare arbitraria nell'espressione condizionale (?(pattern)yes|no).
  • Sottrazione di classe carattere (non documentata?) [a-z-[d-w]]
  • Gruppo di bilanciamento (?<-name>…). Questo potrebbe essere simulato con l'asserzione di valutazione del codice (?{…}) seguito da uno (?&name).

Riferimenti:

+3

+1 Ottima risposta –

+0

Impressionante, grazie ... A proposito, sono rimasto piacevolmente sorpreso di quanto siano compatibili i 2 dialetti ... anche il look-around, ecc. Inoltre non avevo conosciuto il metodo Regex.Replace in .NET. supportato sostituendo le sottoespressioni parentesi combinate ($ 1, $ 2, ecc.) in questo modo: str = Regex.Replace (str, @ "([az] +): (\ d +)", m => m.Result ("$ 1 - $ 2 ")) che corrisponde al Perl: s/([az] +): (\ d +)/$ 1 - $ 2/g – JoelFan

+0

" Alcuni elementi sono solo Perl "non menziona la traduzione dei caratteri (come tr/tgca/acgt /), quindi è supportato, non è vero? – mbx

2

Erano designed to be compatible con re espressioni regolari di Perl 5. In quanto tale, Perl 5 regexes dovrebbe solo funzionare in. NET.

Puoi tradurre alcuni RegexOptions come segue:

[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 
} 

Un altro suggerimento è quello di usare le stringhe letterali in modo che non c'è bisogno di fuggire tutti quei caratteri di escape in C#:

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

non sono un esperto in .NET, ma immagino che il suo il contrario ... –

+3

@Eric: Nessuno è un superset dell'altro. – kennytm

+1

No, .NET è arrivato dopo Perl 5 e ha copiato la sua sintassi regex vincente. –

1

E ' dipende davvero dalla complessità dell'espressione regolare - molti di essi funzioneranno allo stesso modo.

Dai un'occhiata a this. Scheda regex .NET per vedere se un operatore fa ciò che ti aspetti che faccia.

Non so di alcuno strumento che si traduca automaticamente tra i dialetti RegEx.

+0

RegexBuddy può prendere un'espressione regolare in una grande varietà di sapori e convertirlo in un altro - purché la funzionalità richiesta sia supportata dal gusto regex di destinazione . –