2010-08-22 11 views

risposta

29

È possibile utilizzare modificatori in linea come segue:

// case insensitive match 
Regex MyRegex = new Regex(@"(?i)[a-z]+"); // case insensitive match 

o, invertire il senso del modificatore di aggiungendo un segno meno:

// case sensitive match 
Regex MyRegex = new Regex(@"(?-i)[a-z]+"); // case sensitive match 

o, li interruttore acceso e spento:

// case sensitive, then case-insensitive match 
Regex MyRegex = new Regex(@"(?-i)[a-z]+(?i)[k-n]+"); 

In alternativa, è possibile utilizzare la modalità modificatore arco sintassi usando i due punti : e una parentesi di raggruppamento, che ambiti il ​​modificatore solo a quel gruppo:

// case sensitive, then case-insensitive match 
Regex MyRegex = new Regex(@"(?-i:[a-z]+)(?i:[k-n]+)"); 

È possibile utilizzare più modificatori in una sola volta come questo (?is-m:text), o dopo un altro, se lo trovi più chiaro (?i)(?s)(?-m)text (non lo faccio). Quando si utilizza la sintassi di attivazione/disattivazione, tenere presente che il modificatore funziona fino al prossimo passaggio o alla fine della regex. Al contrario, utilizzando gli span modificati in base alla modalità, dopo l'intervallo verrà applicato il comportamento predefinito.

Infine: i modificatori consentiti in .NET sono (utilizzano un meno per invertire la modalità):

x permettono spazi e commenti
s singola linea modalità
m modalità linea a più
i caso insensibilità
n consente solo l'acquisizione esplicita (specifica .NET)

+1

Grazie. Quindi, se voglio usare più modificatori, faccio semplicemente '(? Imsx)' invece di '(? I)', per esempio? – Aillyn

7

Utilizzare in questo modo:

Regex MyRegex = new Regex(@"(?i:[a-z]+)"); 

Prefix l'opzione in linea al modello con (?<option>:<pattern>). In questo caso l'opzione è "i" per IgnoreCase.

Specificando i due punti sopra, si imposta l'opzione su quel modello. Per rendere l'opzione si applica a tutto il modello è possibile impostare in principio da solo:

@"(?i)[a-z]+" 

E 'anche possibile utilizzare più opzioni e accendere e spegnere:

// On: IgnoreCase, ExplicitCapture. Off: IgnorePatternWhitespace 
@"(?in-x)[a-z]+" 

Questo consente flessibilità in un pattern per abilitare/disabilitare le opzioni in diversi punti di una regex che non è possibile quando si utilizza lo RegexOptions sull'intero pattern.

Ecco un esempio poco approfondito.Vi incoraggio a giocare con esso per capire quando le opzioni hanno effetto.

string input = "H2O (water) is named Dihydrogen Monoxide or Hydrogen Hydroxide. The H represents a hydrogen atom, and O is an Oxide atom."; 

// n = explicit captures 
// x = ignore pattern whitespace 
// -i = remove ignorecase option 
string pattern = @"di?(?nx-i) (hydrogen) | oxide"; 
var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); 
Console.WriteLine("Total Matches: " + matches.Count); 
foreach (Match match in matches) 
{ 
    Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups[1].Captures.Count); 
} 

Console.WriteLine(); 

// n = explicit captures 
// x = ignore pattern whitespace 
// -i = remove ignorecase option 
// -x = remove ignore pattern whitespace 
pattern = @"di?(?nx-i) (?<H> hydrogen) (?-x)|oxide"; 
matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); 
Console.WriteLine("Total Matches: " + matches.Count); 
foreach (Match match in matches) 
{ 
    Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups["H"].Captures.Count); 
} 

L'uscita per quanto sopra è:

Total Matches: 3 
Match: Dihydrogen - Groups: 0 
Match: oxide - Groups: 0 
Match: oxide - Groups: 0 

Total Matches: 3 
Match: Dihydrogen - Groups: 1 
Match: oxide - Groups: 0 
Match: oxide - Groups: 0 

In entrambi i modelli RegexOptions.IgnoreCase è utilizzato che permette "di" essere case insensitive e corrispondere a "diidrogeno" (capitale D). Poiché l'acquisizione esplicita è attiva, il primo esempio non ha gruppi per (hydrogen) poiché non utilizza un gruppo denominato, che è il requisito per l'acquisizione esplicita. Il secondo modello ha 1 gruppo poiché utilizza (?<H> hydrogen).

Successivamente, si noti che il secondo motivo viene modificato per utilizzare (?-x)|oxide alla fine. Poiché IgnorePatternWhitespace è disabilitato dopo la cattura dell'idrogeno, il resto del modello deve essere formato correttamente non avendo spazi bianchi aggiuntivi (confrontare con il primo schema) finché (?x) non viene attivato in seguito nel modello. Questo non ha uno scopo reale, ma mostra semplicemente un uso approfondito delle opzioni inline per dimostrare quando effettivamente danno il via.

Problemi correlati