Ho alcuni utili regular expressions in Perl. C'è un modo semplice per tradurli in dialetto .NET di espressioni regolari?Traduci espressioni regolari Perl su .NET
In caso contrario, esiste un riferimento sintetico delle differenze?
Ho alcuni utili regular expressions in Perl. C'è un modo semplice per tradurli in dialetto .NET di espressioni regolari?Traduci espressioni regolari Perl su .NET
In caso contrario, esiste un riferimento sintetico delle differenze?
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:
\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.(?(name)yes|no)
, ma (?(<name>)yes|no)
in Perl.Alcuni elementi sono Perl-only:
x?+
, x*+
, x++
ecc). Utilizzare invece la sottoespressione senza backtracking ((?>…)
).\N{LATIN SMALL LETTER X}
, \N{U+200A}
.\l
(minuscolo carattere successivo), \u
(maiuscolo carattere successivo).\L
(lettere minuscole), \U
(lettere maiuscole), \Q
(virgolette caratteri) fino a \E
.\pL
e \PL
. Devi includere le parentesi in. NET ad es. \p{L}
.\X
, \C
.\v
, \V
, \h
, \H
, \N
, \R
\g1
, \g{-1}
. È possibile utilizzare solo l'indice di gruppo assoluto in .NET.\g{name}
. Utilizzare invece \k<name>
.[[:alpha:]]
.(?|…)
\K
. Utilizzare invece look-behind ((?<=…)
).(?{…})
, subexpression post-poned (??{…})
.(?0)
, (?R)
, (?1)
, (?-1)
, (?+1)
, (?&name)
.(?{…})
(R)
, (R1)
, (R&name)
(DEFINE)
.(*VERB:ARG)
(?P<name>…)
. Utilizzare invece (?<name>…)
.(?P=name)
. Utilizzare invece \k<name>
.(?P>name)
. Nessun equivalente in .NET.Alcuni elementi sono NET solo:
\K
.(?(pattern)yes|no)
.[a-z-[d-w]]
(?<-name>…)
. Questo potrebbe essere simulato con l'asserzione di valutazione del codice (?{…})
seguito da uno (?&name)
.Riferimenti:
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}";
non sono un esperto in .NET, ma immagino che il suo il contrario ... –
@Eric: Nessuno è un superset dell'altro. – kennytm
No, .NET è arrivato dopo Perl 5 e ha copiato la sua sintassi regex vincente. –
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.
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 . –
+1 Ottima risposta –
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
" Alcuni elementi sono solo Perl "non menziona la traduzione dei caratteri (come tr/tgca/acgt /), quindi è supportato, non è vero? – mbx