138 votes

Le RegEx Java est-il insensible à la casse ?

En Java, lorsque l'on effectue un replaceAll pour rechercher un motif de type regex comme :

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

(pour supprimer les doublons de mots consécutifs insensibles à la casse, par exemple Test test), je ne suis pas sûr de l'endroit où je dois mettre la fonction ?i . J'ai lu qu'il était censé se trouver au début, mais si je l'enlève, j'attrape des mots consécutifs dupliqués (par exemple test test), mais pas des mots insensibles à la casse (par exemple test test). J'ai donc pensé ajouter le ?i au début, mais cela ne semble pas fonctionner. Qu'en pensez-vous ? Je vous remercie.

198voto

Christian Vielma Points 1313

Vous pouvez également faire correspondre des regex insensibles à la casse et les rendre plus lisibles en utilisant la constante Pattern.CASE_INSENSITIVE comme :

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);

150voto

cnanney Points 784

RegexBuddy me dit que si vous voulez l'inclure au début, c'est la bonne syntaxe :

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"

143voto

polygenelubricants Points 136838

Oui, l'insensibilité à la casse peut être activée ou désactivée à volonté dans les expressions rationnelles de Java.

Il semble que vous souhaitiez quelque chose comme ceci :

    System.out.println(
        "Have a meRry MErrY Christmas ho Ho hO"
            .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
    );
    // Have a meRry Christmas ho

Il convient de noter que le incorporé Pattern.CASE_INSENSITIVE est (?i) no \?i . Notez également qu'un \b a été supprimée du modèle.

En (?i) est placé au début du motif pour permettre l'insensibilité à la casse. Dans ce cas particulier, il n'est pas remplacé plus loin dans le motif, de sorte que l'ensemble du motif est insensible à la casse.

Il convient de noter qu'il est possible de limiter la sensibilité à la casse à certaines parties du modèle. Ainsi, la question de savoir où la placer dépend vraiment de la spécification (bien que pour ce problème particulier, cela n'ait pas d'importance puisque \w est insensible à la casse.

En guise de démonstration, voici un exemple similaire de regroupement de séries de lettres telles que "AaAaaA" pour seulement "A" .

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
    ); // A e I O u

Supposons maintenant que nous spécifions que l'exécution ne doit être réduite que si elle commence par une lettre majuscule. Dans ce cas, nous devons placer l'élément (?i) à l'endroit approprié :

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
    ); // A eeEeeE I O uuUuUuu

Plus généralement, vous pouvez activer et désactiver à votre guise n'importe quel indicateur du modèle.

Voir aussi

Questions connexes

46voto

relet Points 2668

Si l'ensemble de votre expression n'est pas sensible à la casse, vous pouvez vous contenter de spécifier l'attribut CASE_INSENSITIVE drapeau :

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

1voto

Vous pouvez également mettre en minuscules votre chaîne initiale, que vous allez vérifier pour la recherche de motifs. Et utiliser respectivement des symboles minuscules dans votre modèle.

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