2010-03-13 10 views
64

Ist es möglich, in C# mit der Regex-Klasse eine Groß-/Kleinschreibung zu beachten, ohne das Flag RegexOptions.IgnoreCase zu setzen?Groß-/Kleinschreibung beachten Regex ohne RegexOptions-Enumeration

Was ich gerne tun könnte, ist innerhalb der Regex selbst zu definieren, ob die Matchoperation in Groß- und Kleinschreibung durchgeführt werden soll oder nicht.

ich diese Regex möchte, taylor, auf den folgenden Werten entsprechen:

  • Taylor
  • taylor
  • TAYLOR

Antwort

93

MSDN Documentation

(?i)taylor Matches alle von die Eingänge I s pecified, ohne das Flag RegexOptions.IgnoreCase setzen zu müssen.

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

Es ist wie andere Optionen sieht gehören:

  • i, unempfindlich Fall
  • s, Einzeilenmode
  • m, Multi-Line-Modus
  • x, freier Abstand Modus
+0

Wie kann ich dies ein hinzufügen Ausdruck wie folgt: public const String URL = @ "^ (? :(?: https? | ftp): \/\ /) (?: \ S + (? :: \ S *)? @)? (? :(?! (?: 10 | 127) (?: \. \ D {1,3}) {3}) (?! (?: 169 \ .254 | 192 \ .168) (?: \. \ D { 1,3}) {2}) (?! 172 \. (?: 1 [6-9] | 2 \ d | 3 [0-1]) (?: \. \ D {1,3}) { 2}) (?: [1-9] \ d?| 1 \ d \ d | 2 [01] \ d | 22 [0-3]) (?: \. (?: 1? \ D {1,2} | 2 [0-4] \ d | 25 [ 0-5])) {2} (?: \. (?: [1-9] \ d? | 1 \ d \ d | 2 [0-4] \ d | 25 [0-4])) | (?: (?: [az \ u00a1- \ uffff0-9] - *) * [az \ u00a1- \ uffff0-9] +) (?: \. (?: [az \ u00a1- \ uffff0-9] - *) * [az \ u00a1- \ uffff0-9] +) * (?: \. (?: [az \ u00a1- \ uffff] {2,})) \.?) (? :: \ d { 2,5})? (?: [/? #] \ S *)? $ "; – Yovav

24

Wie löffel16 sagt, ist es (?i). MSDN hat eine Liste von regular expression options, die für nur Teil einer Übereinstimmung ein Beispiel der Verwendung von Groß- und Kleinschreibung Anpassung umfasst:

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

Hier ist die „t“ matched-unsensibel, aber der Rest ist Groß- . Wenn Sie keinen Teilausdruck angeben, wird die Option für den Rest der umschließenden Gruppe festgelegt.

Also für Ihr Beispiel könnten Sie haben:

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

Dies würde passen, aber nicht "MEIN NAME IST taylor" "Mein Name ist Taylor".

47

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

Gerade FYI, es gibt ein paar Tricks, die Sie damit machen kann:

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 Fahnen wie folgt kombinieren: a(?mi-s)bc Bedeutung:

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' 
Verwandte Themen