11
votes

Quel est le point derrière les intersections de la classe de caractères dans Java Regex?

Regex.Pattern de Java prend en charge la classe de caractères suivante: xxx

qui correspond à "D, E ou F" et s'appelle une intersection.

fonctionnel. Non différent de: xxx

qui est plus simple à lire et à comprendre dans un grand re. Donc, ma question est de savoir quelle utilisation sont des intersections, autres que la spécification de la prise en charge complète des opérations de type CSG sur les classes de caractères?

(Veuillez noter, je comprends l'utilité des soustractions telles que [A-Z && [[ ^ bc]]] et [a-z && [^ mp]]] , je demande spécifiquement des intersections telles que présentées ci-dessus.)


0 commentaires

4 Réponses :


1
votes

Je crois que cet échantillon est juste une "preuve de concept". Deux classes de caractères intersectées ne correspondent qu'à un caractère qui correspond à la fois individuellement des deux séries de caractères. Les soustractions que vous avez mentionnées sont les applications pratiques réelles de l'opérateur.

Mettez simplement, il n'y a pas de sens caché.


0 commentaires

1
votes

Vous pouvez créer une regex correspondante entre deux ensembles par programme:

String regex = String.format("[%s&&[%s]]", characterClass, whiteList);


1 commentaires

Cela a du sens d'une perspective théorique, mais quel est un exemple pratique où vous l'utiliseriez jamais?



4
votes

Bien que je n'ai jamais eu la nécessité de le faire, je pouvais imaginer une utilisation avec des classes de caractères prédéfinies qui ne sont pas des sous-ensembles appropriés (ainsi que de l'intersection produise quelque chose de différent de deux classes de caractères originales) . Par exemple. Associer uniquement les caractères latins minuscules:

[\p{Ll}&&\p{InBasicLatin}]


2 commentaires

Peut-être, mais le résultat de la RE ci-dessus n'est pas différent de [\ p {inférieur}], car \ p {inférieur} par définition ne sont que les lettres minuscules de votre alphabet par défaut. Si votre alphabet par défaut n'est pas latin, cela ne correspondra en rien.


Changé \ p {inférieur} sur \ p {ll} pour éviter le problème de l'alphabet par défaut.



1
votes

L'intersection est utile lorsque la classe d'une classe n'est pas un sous-ensemble de l'autre ensemble. Il existe de nombreuses classes de caractères prédéfinies (une liste partielle est donnée dans le Javadoc ), en particulier les différents blocs d'Unicode. Supposons qu'il existe un bloc défini pour tous les caractères utilisés en chinois et un pour tous les caractères utilisés en japonais. Il y a une bonne quantité de chevauchement, mais ce n'est pas complet de chaque côté (je ne sais pas si les classes de bloc UNICODE reflètent ceci). Si vous vouliez correspondre uniquement aux caractères qui se produisent dans les deux langues, vous pouvez utiliser une intersection des deux.


0 commentaires