Regex ohne Berücksichtigung der Groß- und Kleinschreibung ohne Verwendung der RegexOptions-Aufzählung

76

Ist es möglich, in C # mithilfe der Regex-Klasse eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung vorzunehmen, ohne das Flag RegexOptions.IgnoreCase zu setzen?

Was ich tun möchte, ist, innerhalb des regulären Ausdrucks selbst zu definieren, ob die Übereinstimmungsoperation ohne Berücksichtigung der Groß- und Kleinschreibung erfolgen soll oder nicht.

Ich möchte, dass dieser reguläre Ausdruck taylormit den folgenden Werten übereinstimmt:

  • Taylor
  • Taylor
  • taYloR
Eric Schoonover
quelle

Antworten:

108

MSDN-Dokumentation

(?i)taylor stimmt mit allen von mir angegebenen Eingaben überein, ohne das Flag RegexOptions.IgnoreCase setzen zu müssen.

Um die Groß- und Kleinschreibung zu erzwingen, kann ich tun (?-i)taylor.

Es sieht so aus, als ob andere Optionen Folgendes umfassen:

  • i, Groß- und Kleinschreibung nicht berücksichtigen
  • s, einzeiliger Modus
  • m, Mehrleitungsmodus
  • x, Freiraummodus
Eric Schoonover
quelle
59

Wie Sie bereits herausgefunden haben, (?i)ist das Inline-Äquivalent von RegexOptions.IgnoreCase.

Nur zu Ihrer Information, es gibt ein paar Tricks, die Sie damit machen können:

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'

Und Sie können sogar Flags wie folgt kombinieren: a(?mi-s)bcBedeutung:

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'
Bart Kiers
quelle
27

Wie Spoon16 sagt, ist es (?i). MSDN verfügt über eine Liste von Optionen für reguläre Ausdrücke, die ein Beispiel für die Verwendung der Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung für nur einen Teil einer Übereinstimmung enthält:

 string pattern = @"\b(?i:t)he\w*\b";

Hier wird das "t" ohne Berücksichtigung der Groß- und Kleinschreibung abgeglichen, während der Rest zwischen Groß- und Kleinschreibung unterscheidet. Wenn Sie keinen Unterausdruck angeben, wird die Option für den Rest der umschließenden Gruppe festgelegt.

Für Ihr Beispiel könnten Sie also haben:

string pattern = @"My name is (?i:taylor).";

Dies würde mit "Mein Name ist TAYlor" übereinstimmen, aber nicht mit "MEIN NAME IST Taylor".

Jon Skeet
quelle