web-dev-qa-db-fra.com

Regex insensible à la casse sans utiliser l'énumération RegexOptions

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:

  • Taylor
  • taylor
  • taYloR
75
Eric Schoonover

Documentation MSDN

(?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 casse
  • s, mode ligne unique
  • m, mode multi-lignes
  • x, mode d'espacement libre
105
Eric Schoonover

Comme 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'
58
Bart Kiers

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

26
Jon Skeet