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!
RegexBuddy me dit si vous voulez l'inclure au début, voici la syntaxe correcte:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
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);
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.
Java.util.regex.Pattern
/regex/i
(Pattern.CASE_INSENSITIVE
En Java), vous pouvez faire /(?i)regex/
/first(?i)second(?-i)third/
/first(?i:second)third/
\b
entre un \w
et un \s
)Si toute votre expression ne respecte pas la casse, vous pouvez simplement spécifier le CASE_INSENSITIVE
drapeau:
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
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.