Sont Java et C# expressions régulières compatibles?
Les deux langues prétendent utiliser Perl style des expressions régulières. Si j'ai un test de langue est une expression régulière pour la validité, il travaillera dans l'autre? Où l'expression régulière syntaxes diffèrent-ils?
Le cas d'utilisation ici est un C# (.NETTE) de l'INTERFACE utilisateur de parler à un éventuel Java back-end de mise en œuvre qui va utiliser les regex pour correspondre aux données.
Remarque que j'ai seulement besoin de s'inquiéter à propos de la correspondance, pas sur l'extraction des portions de données appariées.
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup de différences.
Classe De Personnage
[abc-[cde]]
[abc&&[^cde]]
)[abc&&[cde]]
[abc-[^cde]]
)\p{Alpha}
De caractères POSIX classe(?x)
modeCOMMENTAIRES
/IgnorePatternWhitespace
, de l'espace (U+0020) dans la classe de personnage est significative.\p{L}
forme seulement\pL
,\p{L}
,\p{IsL}
\p{general_category=L}
,\p{gc=L}
\p{Lu}
forme seulement\p{Lu}
,\p{IsLu}
\p{general_category=Lu}
,\p{gc=Lu}
\p{IsBasicLatin}
seulement. (Soutenu Nommé Blocs)\p{InBasicLatin}
\p{block=BasicLatin}
,\p{blk=BasicLatin}
BasicLatin
peut être écrite commeBasic_Latin
ouBasic Latin
)Quantificateur
?+
,*+
,++
et{m,n}+
(possessif quantificateurs)Devis
\Q...\E
échappe à une chaîne de caractères de remplacement\Q...\E
échappe à une chaîne de caractère de classe des caractères de remplacement (dans les jeux de caractères)Correspondance de construire
(?(?=regex)then|else)
,(?(regex)then|else)
,(?(1)then|else)
ou(?(group)then|else)
(?<name>regex)
ou(?'name'regex)
\k<name>
ou\k'name'
(?<name>regex)
\k<name>
(?<name1-name2>regex)
ou(?'name1-name2'subexpression)
Affirmations
(?<=text)
(positif lookbehind)(?<!text)
(négatif lookbehind)Options De Mode/Drapeaux
ExplicitCapture
option(?n)
Divers
(?#comment)
commentaires en ligneRéférences
x
drapeau bien que la syntaxe diffère du C#. download.oracle.com/javase/1.4.2/docs/api/java/util/regex/...Découvrez: http://www.regular-expressions.info/refflavors.html
Beaucoup de regex info sur ce site, et il y a un beau tableau qui détaille les différences entre java & .net.
c# regex a sa propre convention pour les groupes nommés
(?<name>)
. Je ne connais pas d'autres différences.Java utilise Perl standard type regex ainsi que les regex POSIX. En regardant le C# de la documentation sur les regexs, il semble que Java a tous C# syntaxe regex, mais pas l'inverse.
Comparer vous-même: Java: C#:
EDIT:
Actuellement, aucun autre regex saveur prend en charge la version de Microsoft de nommée à la capture.
.NET Regex prend en charge le comptage, de sorte que vous pouvez faire correspondre les parenthèses imbriquées qui est quelque chose que vous ne pouvez pas faire avec une expression régulière. En fonction de la maîtrise des Expressions Régulières qui est l'un des quelques implémentations de le faire, de sorte que pourrait être une différence.
De mon expérience:
Java 7 expressions régulières par rapport à .NET 2.0 expressions régulières:
Symbole de soulignement dans les noms de groupe n'est pas pris en charge
Groupes avec le même nom (dans la même expression régulière) ne sont pas pris en charge (bien qu'il peut être vraiment utile dans des expressions à l'aide "ou"!)
Groupes ayant capturé rien d'avoir de la valeur de
null
et non pas d'un chaîne videGroupe avec l'index 0 contient également l'ensemble du match (le même que dans .NET), MAIS n'est pas inclus dans
groupCount()
Groupe de référence de remplacer des expressions est également indiqué avec le signe du dollar (par exemple, $1), mais si la même expression contient le signe du dollar comme la fin-de-ligne
marqueur, puis le dos de référence dollar devrait être échappé (\$), sinon en Java, nous obtenons le "groupe illégal de référence" erreur
Fin-de-ligne, symbole ($) se comporte de façon gourmande. Considérons, par exemple, l'expression suivante (Java-chaîne est donnée): "bla(bla(?:$|\r\n))+)?$". Voici le dernier
ligne de texte sera PAS capturé! Pour le capturer, nous devons remplacer "$" par "\z".
Il n'y a pas de "Explicite" Capture mode.
Chaîne vide n'est pas satisfaire à l' ^.{0}$ motif.
Symbole "-" doit être protégé lorsqu'il est utilisé à l'intérieur des crochets. C'est, modèle "[a-z+-]+" ne correspond pas à la chaîne "f+g-h" en Java, mais il n'en .NET. Pour correspondre à
en Java, ce modèle devrait ressembler (Java-chaîne est donnée): "[a-z+\-]+".
NOTE: "(Java-chaîne est donnée)" - juste pour expliquer le double s'échappe dans l'expression.