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].*

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


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.


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


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)

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].*/.


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))
{
...
}

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.


2

C #

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

spécifiquement: options: RegexOptions.IgnoreCase


1

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


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:


0

En Java, le Regexconstructeur a

Regex(String pattern, RegexOption option)

Donc, pour ignorer les cas, utilisez

option = RegexOption.IGNORE_CASE

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


-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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.