2010-08-22 9 views

Respuesta

29

Puede utilizar modificadores de línea de la siguiente manera:

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

o, invertir el sentido del modificador añadiendo un signo menos:

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

o, cambiarlos por intervalos:

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

Como alternativa, puede utilizar el lapso de sintaxis modo de modificador con dos puntos : y un paréntesis de agrupación, que alcances el modificador sólo a ese grupo:

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

Se pueden utilizar varios modificadores de una sola vez como esto (?is-m:text), o después de otro, si lo encuentra más claro (?i)(?s)(?-m)text (yo no). Cuando use la sintaxis de encendido/apagado, tenga en cuenta que el modificador funciona hasta el próximo cambio o al final de la expresión regular. Por el contrario, utilizando los tramos modificados en modo, después del tramo se aplicará el comportamiento predeterminado.

Finalmente: los modificadores permitidos en .NET son (utilizan un signo menos para invertir el modo):

x permiten espacios en blanco y comentarios
s sola línea de modo
m modo de línea de múltiples
i caso insensibilidad
n solo permite la captura explícita (específica de .NET)

+1

Gracias. Entonces, si quiero usar varios modificadores, simplemente hago '(? Imsx)' en lugar de '(? I)', por ejemplo. – Aillyn

7

Úselo de esta manera:

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

Prefijo la opción en línea para su patrón con (?<option>:<pattern>). En este caso, la opción es "i" para IgnoreCase.

Al especificar dos puntos encima, está configurando la opción solo para ese patrón. Para hacer que la opción se aplica a todo el patrón es posible configurarlo en un principio por su propia cuenta:

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

También es posible utilizar múltiples opciones y encenderlos y fuera:

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

Este permite flexibilidad en un patrón para habilitar/deshabilitar opciones en diferentes puntos de una expresión regular que no es posible cuando se usa RegexOptions en todo el patrón.

Aquí hay un ejemplo un poco profundo.Te animo a que juegues con él para comprender cuándo las opciones surten efecto.

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); 
} 

La salida para el anterior es:

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 

En ambos patrones RegexOptions.IgnoreCase se utiliza lo que permite "di" para ser sensible a mayúsculas y por lo tanto coincidirá con "dihidrógeno" (capital D). Como la captura explícita está activada, el primer ejemplo no tiene ningún grupo para (hydrogen), ya que no usa un grupo con nombre, que es el requisito para la captura explícita. El segundo patrón tiene 1 grupo ya que usa (?<H> hydrogen).

A continuación, observe que el segundo patrón se modifica para usar (?-x)|oxide al final. Como IgnorePatternWhitespace está desactivado después de la captura de hidrógeno, el resto del patrón debe formarse correctamente al no tener espacio en blanco adicional (compárelo con el primer patrón) hasta que (?x) se active más adelante en el patrón. Esto no sirve para nada, pero solo muestra un uso profundo de las opciones en línea para demostrar cuándo se activan.

Cuestiones relacionadas