Regex.Pattern de Java prend en charge la classe de caractères suivante: qui correspond à "D, E ou F" et s'appelle une intersection. P> fonctionnel. Non différent de: p> 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? P> (Veuillez noter, je comprends l'utilité des soustractions telles que [A-Z && [[ ^ bc]]] code> et [a-z && [^ mp]]] code>, je demande spécifiquement des intersections telles que présentées ci-dessus.) p> p>
4 Réponses :
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. P>
Mettez simplement, il n'y a pas de sens caché. P>
Vous pouvez créer une regex correspondante entre deux ensembles par programme:
String regex = String.format("[%s&&[%s]]", characterClass, whiteList);
Cela a du sens d'une perspective théorique, mais quel est un exemple pratique où vous l'utiliseriez jamais?
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}]
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.
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. p>