43 votes

Les expressions régulières Java et C # sont-elles compatibles?

Les deux langues prétendent utiliser des expressions régulières de style Perl. Si l'une des langues teste une expression régulière pour vérifier sa validité, cela fonctionnera-t-il dans l'autre? Où les syntaxes d'expression régulière diffèrent-elles?

Le cas d'utilisation ici est une interface utilisateur C # (.NET) qui communique avec une éventuelle implémentation dorsale Java qui utilisera l'expression régulière pour faire correspondre les données.

Notez que je dois seulement m'inquiéter de la correspondance, pas de l'extraction de parties des données correspondantes.

93voto

Drew Noakes Points 69288

Il y a beaucoup de différences.

Classe De Personnage

  1. Les classes de caractères soustraction [abc-[cde]]
    • .NET OUI (2.0)
    • Java: Émulé via caractère de classe de l'intersection et de la négation: [abc&&[^cde]])
  2. Les classes de caractères intersection [abc&&[cde]]
    • .NET: Émulé via caractère de classe de la soustraction et de la négation: [abc-[^cde]])
    • Java OUI
  3. \p{Alpha} Classe de caractères POSIX
    • .NET PAS
    • Java OUI (US-ASCII)
  4. En vertu de l' (?x) mode COMMENTS/IgnorePatternWhitespace, de l'espace (U+0020) dans la classe de personnage est importante.
    • .NET OUI
    • Java N'
  5. Unicode Catégorie (L, M, N, P, S, Z, C)
    • .NET OUI: \p{L} seulement sous la forme
    • Java OUI:
      • À Partir De Java 5: \pL, \p{L}, \p{IsL}
      • À Partir De Java 7: \p{general_category=L}, \p{gc=L}
  6. Unicode Catégorie (Lu, Ll, Lt, ...)
    • .NET OUI: \p{Lu} seulement sous la forme
    • Java OUI:
      • À Partir De Java 5: \p{Lu}, \p{IsLu}
      • À Partir De Java 7: \p{general_category=Lu}, \p{gc=Lu}
  7. Blocs Unicode
    • .NET OUI: \p{IsBasicLatin} seulement. (Pris En Charge Nommées Blocs)
    • Java OUI: (nom du bloc est libre-boîtier)
      • À Partir De Java 5: \p{InBasicLatin}
      • À Partir De Java 7: \p{block=BasicLatin}, \p{blk=BasicLatin}
  8. Des espaces et des caractères de soulignement autorisé dans tous les bloc de noms (par exemple, BasicLatin peut être écrite de la Basic_Latin ou Basic Latin)
    • .NET PAS
    • Java OUI (Java 5)

Quantificateur

  1. ?+, *+, ++ et {m,n}+ (possessif quantificateurs)
    • .NET PAS
    • Java OUI

Citation

  1. \Q...\E s'échappe d'une chaîne de caractères de remplacement
    • .NET PAS
    • Java OUI
  2. \Q...\E s'échappe d'une chaîne de caractère de classe des caractères de remplacement (dans les jeux de caractères)
    • .NET PAS
    • Java OUI

De correspondance de construire

  1. Conditionnel correspondance (?(?=regex)then|else), (?(regex)then|else), (?(1)then|else) ou (?(group)then|else)
    • .NET OUI
    • Java N'
  2. Capture d'un groupe nommée et nommé backreference
    • .NET OUI:
      • Capture d'un groupe: (?<name>regex) ou (?'name'regex)
      • La référence arrière: \k<name> ou \k'name'
    • Java OUI (Java 7):
      • Capture d'un groupe: (?<name>regex)
      • La référence arrière: \k<name>
  3. Plusieurs de capturer les groupes peuvent avoir le même nom
    • .NET OUI
    • Java N' (Java 7)
  4. L'équilibrage de la définition du groupe (?<name1-name2>regex) ou (?'name1-name2'subexpression)
    • .NET OUI
    • Java N'

Les Assertions

  1. (?<=text) (positif lookbehind)
    • .NET de largeur Variable
    • Java Évident largeur
  2. (?<!text) (négatif lookbehind)
    • .NET de largeur Variable
    • Java Évident largeur

Les Options De Mode/Drapeaux

  1. ExplicitCapture option (?n)
    • .NET OUI
    • Java N'

Divers

  1. (?#comment) commentaires en ligne
    • .NET OUI
    • Java N'

Références

6voto

Seth Points 18568

Consultez: http://www.regular-expressions.info/refflavors.html Nombreuses informations sur les expressions rationnelles sur ce site, et un joli graphique détaille les différences entre java et .net.

4voto

Rex M Points 80372

c # regex a sa propre convention pour les groupes nommés (?<name>) . Je ne connais aucune autre différence.

2voto

Brian Rasmussen Points 68853

.NET Regex prend en charge le comptage, vous pouvez donc faire correspondre les parenthèses imbriquées, ce que vous ne pouvez normalement pas faire avec une expression régulière. Selon Mastering Regular Expressions, c'est l'une des rares applications à le faire. Cela pourrait donc faire la différence.

2voto

WolfmanDragon Points 3328

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.

Comparez vous-même: Java: C#:

EDIT: Actuellement, aucun autre regex saveur prend en charge la version de Microsoft de nommée à la capture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X