Regex: ignorer la sensibilité à la casse

316

Comment puis-je faire ignorer la sensibilité à la casse de l'expression rationnelle suivante? Il doit correspondre à tous les caractères corrects mais ignorer s'ils sont inférieurs ou en majuscules.

G[a-b].*
frère
la source
Il suffit d'inclure les majuscules et les minuscules dans l'expression régulière ou de les convertir en majuscules avant de faire l'appariement d'
expression régulière
2
G [a-bA-B]. * Serait l'évidence dans ce cas général, la sensibilité à la casse dépend de la plateforme afaik et vous ne donnez pas de plateforme.
Joachim Isaksson
16
Si vous utilisez Java, vous pouvez spécifier avec la classe Motif: Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);.
james.garriss
Plus d'options Java ici: blogs.oracle.com/xuemingshen/entry/…
james.garriss
Notez que pour grepcela, c'est simplement l'ajout du -imodificateur. Ex: grep -rni regular_expressionpour rechercher cette 'expression_régulière' 'r' de manière récursive, la casse 'i'nsensitive, montrant la ligne' n'abrite pas dans le résultat.
Gabriel Staples

Réponses:

444

En supposant que vous voulez que toute l' expression régulière ignore la casse, vous devez rechercher le idrapeau . Presque tous les moteurs regex le supportent:

/G[a-b].*/i

string.match("G[a-b].*", "i")

Consultez la documentation de votre langue / plateforme / outil pour savoir comment les modes de correspondance sont spécifiés.

Si vous voulez qu'une partie seulement de l'expression rationnelle soit insensible à la casse (comme le supposait ma réponse d'origine), vous avez deux options:

  1. Utilisez les modificateurs de mode (?i)et [facultativement] (?-i):

    (?i)G[a-b](?-i).*
  2. Mettez toutes les variations (c.-à-d. Minuscules et majuscules) dans l'expression régulière - utile si les modificateurs de mode ne sont pas pris en charge:

    [gG][a-bA-B].*

Une dernière remarque: si vous avez affaire à des caractères Unicode en plus de l'ASCII, vérifiez si votre moteur regex les prend correctement en charge.

mgibsonbr
la source
Brillant! Fonctionne pour: perl -pe 's / ^ utf-8 \? B \?. * $ // gi' Cancer.1631, correspondant / remplaçant la chaîne "UTF-8? B?" dans le dossier Cancer.1631. Cela échoue: perl -pe 's / ^ utf-8 \? B \?. * $ // g' Cancer.1631, en raison de la non-concordance des cas.
Victoria Stuart
Ce message serait beaucoup plus clair s'il ne s'agissait pas d'un exemple aussi précis. Comme si vous vouliez ignorer la casse pour un autre mot tel que ".txt" et ".TXT". En regardant cette réponse, je ne sais toujours pas comment je pourrais le faire.
Kyle Bridenstine
Pour une raison quelconque, l'expression régulière que vous avez publiée ne fonctionne pas dans findl'expression régulière étendue .. par exemple, find . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \)n'affiche aucun dossier .. blanc un enregistrement similaire find . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)sans les modificateurs affiche les dossiers corrects. Une idée pourquoi?
alpha_989
Ici, j'essaie de trouver tous les dossiers commençant par des caractères [a-c]dans le dossier actuel uniquement .. pour faire un peu plus de manipulation ..
alpha_989
Honnêtement, je mettrais l'option 2 dans la partie principale de la réponse car elle est générique et fonctionne avec tous les moteurs regex.
Puterdo Borato
155

Dépend de la mise en œuvre mais j'utiliserais

(?i)G[a-b].

VARIATIONS:

(?i) case-insensitive mode ON    
(?-i) case-insensitive mode OFF

Les saveurs regex modernes vous permettent d'appliquer des modificateurs à une partie seulement de l'expression régulière. Si vous insérez le modificateur (? Im) au milieu de l'expression régulière, le modificateur s'applique uniquement à la partie de l'expression régulière à droite du modificateur. Avec ces saveurs, vous pouvez désactiver les modes en les précédant d'un signe moins (? -I).

La description provient de la page: https://www.regular-expressions.info/modifiers.html

elrado
la source
Il s'agit du format de modification du moteur d'expression rationnelle de TortoiseHg.
mwolfe02
Pourriez-vous me dire comment cela peut être réalisé dans le shell Linux (par exemple dans egrep sans utiliser le commutateur "-i") de manière générique?
Krishna Gupta
1
Expliquer ce que cela (?i)fait et comment y mettre fin ( (?-i)) aurait été très utile. C'est pourquoi votre réponse a 1/3 autant de votes que la question n ° 1 au lieu de presque autant, car ils expliquent ce détail subtil.
Gabriel Staples
55

expression régulière pour valider 'abc' en ignorant la casse

(?i)(abc)
Ravinath
la source
1
Fonctionne parfaitement avec Android Studio logcat
Joe
Fonctionne aussi en python
conner.xyz
47

L' iindicateur est normalement utilisé pour l'insensibilité à la casse. Vous ne donnez pas de langue ici, mais ce sera probablement quelque chose comme /G[ab].*/iou /(?i)G[ab].*/.

chooban
la source
15

Par souci d'exhaustivité, je voulais ajouter la solution pour les expressions régulières en C ++ avec Unicode:

std::tr1::wregex pattern(szPattern, std::tr1::regex_constants::icase);

if (std::tr1::regex_match(szString, pattern))
{
...
}
Frankenstein
la source
1
Quelqu'un peut-il m'expliquer pourquoi ce message a été rejeté? La solution acceptée utilise du code spécifique et par souci d'exhaustivité j'ai voulu ajouter la solution pour les bibliothèques standard du langage c ++. À mon avis, j'ai généré une valeur ajoutée à une question plus générale.
Frankenstein
5

Comme je l'ai découvert à partir de ce post similaire ( ignorecase dans AWK ), sur les anciennes versions de awk (comme sur vanilla Mac OS X), vous devrez peut-être utiliser 'tolower($0) ~ /pattern/'.

IGNORECASEou (?i)ou /pattern/igénérera une erreur ou retournera vrai pour chaque ligne.

senortim
la source
2

C #

using System.Text.RegularExpressions;
...    
Regex.Match(
    input: "Check This String",
    pattern: "Regex Pattern",
    options: RegexOptions.IgnoreCase)

spécifiquement: options: RegexOptions.IgnoreCase

Donkey Kong
la source
1

[gG] [aAbB]. * solution probablement simple si le motif n'est pas trop compliqué ou trop long.

alpha_989
la source
aimerait savoir pourquoi cette réponse est fausse pour la question donnée?
alpha_989
Vous l'avez dans votre réponse "n'est pas trop compliqué ou long"
reggaeguitar
C'est en fait la seule solution qui a fonctionné pour mon cas. Cela ressemble également à la solution la plus générique qui devrait fonctionner partout. Toutes les autres réponses semblent être très spécifiques pour des implémentations regex particulières.
Puterdo Borato
1

Ajout aux réponses déjà acceptées:

Utilisation de grep:

Notez que pour grepcela, c'est simplement l'ajout du -imodificateur. Ex: grep -rni regular_expressionpour rechercher cette 'expression_régulière' 'r' de manière récursive, la casse 'i'nsensitive, montrant la ligne' n'abrite pas dans le résultat.

En outre, voici un excellent outil pour vérifier les expressions régulières: https://regex101.com/

Ex: Voir l'expression et l'explication dans cette image.

entrez la description de l'image ici

Références:

Gabriel Staples
la source
0

En Java, le Regexconstructeur a

Regex(String pattern, RegexOption option)

Donc, pour ignorer les cas, utilisez

option = RegexOption.IGNORE_CASE
Aziz
la source
0

Vous pouvez pratiquer Regex dans Visual Studio et Visual Studio Code à l'aide de find / replace.

Vous devez sélectionner à la fois Match Case et Expressions régulières pour les expressions regex avec case. Sinon [AZ] ne fonctionnera pas. Entrez la description de l'image ici

Communauté Visual Studio 2019

David Morrow
la source
-2

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

Alexander Drobyshevsky
la source