web-dev-qa-db-fra.com

Est-ce que Java RegEx ne respecte pas la casse?)?

En Java, quand replaceAll est utilisé, recherchez un motif regex 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 trop où je mets le ?i. J'ai lu qu'il est supposé être au début, mais si je le retire, j'attrape les mots consécutifs en double (par exemple, test test), mais pas les mots ne respectant pas la casse (par exemple, test test). Alors j'ai pensé que je pourrais ajouter le? I au début, mais cela ne semble pas faire le travail. Des pensées? Merci!

97
Crystal

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

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

Vous pouvez également faire correspondre les expressions rationnelles insensibles à la casse et les rendre plus lisibles à l'aide de la constante Pattern.CASE_INSENSITIVE telle que:

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

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

On dirait que vous voulez quelque chose comme ça:

    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é Pattern.CASE_INSENSITIVE est (?i) Et non \?i . Notez également qu'un \b Superflu a été supprimé du motif.

Le (?i) Est placé au début du motif pour permettre l'insensibilité à la casse. Dans ce cas particulier, il n'est pas remplacé ultérieurement dans le modèle, de sorte que l'ensemble du modèle est sensible à la casse.

Il est intéressant de noter qu’en fait, vous pouvez limiter l’insensibilité à la casse à une partie seulement du motif. 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 \w Est insensible à la casse.

Pour illustrer ceci, voici un exemple similaire de réduction de séries de lettres telles que "AaAaaA" À 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. Ensuite, nous devons placer le (?i) À la place appropriée:

    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 du modèle à votre guise.

Voir également

  • Java.util.regex.Pattern
  • regular-expressions.info/Modifiers
    • Spécification des modes dans l'expression régulière
      • Au lieu de /regex/i (Pattern.CASE_INSENSITIVE En 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/
    • Durée du modificateur
      • Vous pouvez aussi faire /first(?i:second)third/
  • regular-expressions.info/Word Boundaries (il y a toujours un \b entre un \w et un \s)

Questions connexes

120
polygenelubricants

Si toute votre expression ne respecte pas la casse, vous pouvez simplement spécifier le CASE_INSENSITIVE drapeau:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
19
relet

Vous pouvez également diriger votre chaîne initiale, que vous allez vérifier pour la correspondance de modèle, en minuscule. Et utilisez dans votre modèle les symboles minuscules, respectivement.

0