Est-il possible de faire une correspondance insensible à la casse en C # en utilisant la classe Regex sans définir l'indicateur RegexOptions.IgnoreCase?
Ce que j'aimerais pouvoir faire, c'est dans le regex lui-même définir si je veux ou non que l'opération de correspondance soit effectuée d'une manière insensible à la casse.
Je voudrais que cette expression régulière, taylor
, corresponde aux valeurs suivantes:
(?i)taylor
correspond à toutes les entrées que j'ai spécifiées sans avoir à définir l'indicateur RegexOptions.IgnoreCase.
Pour forcer la sensibilité à la casse, je peux faire (?-i)taylor
.
Il semble que d'autres options incluent:
i
, insensible à la casses
, mode ligne uniquem
, mode multi-lignesx
, mode d'espacement libreComme vous l'avez déjà découvert, (?i)
Est l'équivalent en ligne de RegexOptions.IgnoreCase
.
Juste pour info, il y a quelques astuces que vous pouvez faire avec:
Regex:
a(?i)bc
Matches:
a # match the character 'a'
(?i) # enable case insensitive matching
b # match the character 'b' or 'B'
c # match the character 'c' or 'C'
Regex:
a(?i)b(?-i)c
Matches:
a # match the character 'a'
(?i) # enable case insensitive matching
b # match the character 'b' or 'B'
(?-i) # disable case insensitive matching
c # match the character 'c'
Regex:
a(?i:b)c
Matches:
a # match the character 'a'
(?i: # start non-capture group 1 and enable case insensitive matching
b # match the character 'b' or 'B'
) # end non-capture group 1
c # match the character 'c'
Et vous pouvez même combiner des drapeaux comme ceci: a(?mi-s)bc
ce qui signifie:
a # match the character 'a'
(?mi-s) # enable multi-line option, case insensitive matching and disable dot-all option
b # match the character 'b' or 'B'
c # match the character 'c' or 'C'
Comme le dit spoon16, c'est (?i)
. MSDN a une liste de options d'expression régulière qui inclut un exemple d'utilisation de la correspondance insensible à la casse pour juste la partie d'une correspondance:
string pattern = @"\b(?i:t)he\w*\b";
Ici, le "t" est apparié sans tenir compte de la casse, mais le reste est sensible à la casse. Si vous ne spécifiez pas de sous-expression, l'option est définie pour le reste du groupe englobant.
Donc pour votre exemple, vous pourriez avoir:
string pattern = @"My name is (?i:taylor).";
Cela correspondrait à "Mon nom est TAYlor" mais pas à "MY NAME IS taylor").