Java RegEx est-il insensible à la casse?

111

En Java, lorsque vous effectuez un replaceAll pour rechercher un modèle d'expression régulière comme:

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

(pour supprimer les mots consécutifs insensibles à la casse en double, par exemple Test test), je ne sais pas où j'ai mis le fichier ?i. J'ai lu que c'était censé être au début, mais si je le retire, j'attrape des mots consécutifs en double (par exemple test test), mais pas des mots insensibles à la casse (par exemple test test). J'ai donc pensé que je pourrais ajouter le? I au début, mais cela ne semble pas faire le travail. Des pensées? Merci!

Cristal
la source

Réponses:

119

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

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
cnanney
la source
168

Vous pouvez également faire correspondre les expressions rationnelles 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);
Christian Vielma
la source
2
Mmmm .... opérations OU inclusives au niveau du bit ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy
4
C'est beaucoup plus lisible que cela (?i), les expressions régulières Java étaient déjà assez illisibles: S
Bartek Banachewicz
C'est la même réponse que la réponse de relet 4 ans auparavant, mais elle obtient tous les votes. Impair.
Zoomzoom
@Zoomzoom, ce n'est pas quand je l'ai écrit :) si vous vérifiez l'historique des éditions de relet, vous voyez qu'il a changé en 2018 stackoverflow.com/posts/3436124/...
Christian Vielma
126

Oui, l'insensibilité à la casse peut être activée et désactivée à volonté dans Java regex.

Il semble que vous vouliez 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

Notez que l' indicateur incorporé ne l' Pattern.CASE_INSENSITIVEest (?i)pas \?i. Notez également qu'un superflu \ba été supprimé du motif.

Le (?i)est placé au début du modèle pour activer l'insensibilité à la casse. Dans ce cas particulier, il n'est pas remplacé plus tard dans le modèle, donc en fait le modèle entier est insensible à la casse.

Il est à noter qu'en fait, vous pouvez limiter l'insensibilité à la casse à seulement certaines parties du modèle entier. Ainsi, la question de savoir où le mettre dépend vraiment de la spécification (bien que pour ce problème particulier, cela n'a pas d'importance car il \west insensible à la casse.

Pour démontrer, voici un exemple similaire de réduction de séries de lettres comme "AaAaaA"juste "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. Ensuite, il faut mettre le (?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 n'importe quel indicateur dans le modèle comme vous le souhaitez.

Voir également

  • java.util.regex.Pattern
  • regular-expressions.info/Modifiers
    • Spécification des modes à l'intérieur de l'expression régulière
      • Au lieu de /regex/i( Pattern.CASE_INSENSITIVEen Java), vous pouvez faire/(?i)regex/
    • Activation et désactivation des modes pour une partie seulement de l'expression régulière
      • Vous pouvez aussi faire /first(?i)second(?-i)third/
    • Étendues de modificateur
      • Vous pouvez aussi faire /first(?i:second)third/
  • regular-expressions.info/Word Boundaries (il y a toujours un \bentre a \wet a \s)

Questions connexes

lubrifiants polygènes
la source
36

Si toute votre expression est insensible à la casse, vous pouvez simplement spécifier l' CASE_INSENSITIVEindicateur:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
relouer
la source
Merci d'avoir répondu. C'est exactement ce que je cherchais. En python, nous avons re.IGNORECASE recherchait une réponse similaire en JAVA.
Doogle
0

Vous pouvez également placer votre chaîne initiale, dont vous allez vérifier la correspondance de modèle, en minuscules. Et utilisez respectivement dans votre modèle des symboles minuscules.

Alexandre Drobyshevsky
la source