solo regulares regular que probar numeros mayores expresiones expresion espacio ejemplos consecutivos blanco c# regex extraction

que - Expresiones regulares C#- ¿Es posible extraer coincidencias mientras coinciden?



probar expresiones regulares (4)

Digamos que tengo una cadena de la que necesito verificar el formato correcto; por ejemplo, RR1234566-001 (2 letras, 7 dígitos, guión, 1 o más dígitos). Yo uso algo como:

Regex regex = new Regex(patternString); if (regex.IsMatch(stringToMatch)) { return true; } else { return false; }

Esto funciona para decirme si el stringToMatch sigue el patrón definido por patternString . Sin embargo, lo que necesito (y termino extrayéndolos más tarde) son: 123456 y 001 , es decir, partes de stringToMatch .

Tenga en cuenta que esta NO es una pregunta sobre cómo construir expresiones regulares. Lo que pregunto es: "¿Hay una manera de hacer coincidir y extraer valores simultáneamente sin tener que usar una función de división más adelante?"


Puedes usar grupos de expresiones regulares para lograr eso. Por ejemplo, esta expresión regular:

(/d/d/d)-(/d/d/d/d/d/d/d)

Emparejemos un número de teléfono con esta expresión regular:

var regex = new Regex(@"(/d/d/d)-(/d/d/d/d/d/d/d)"); var match = regex.Match("123-4567890"); if (match.Success) ....

Si coincide, encontrarás los primeros tres dígitos en:

match.Groups[1].Value

Y los segundos 7 dígitos en:

match.Groups[2].Value

PS En C #, puede usar una cadena de estilo @ "" para evitar el escape de barras invertidas. Por ejemplo, @ "/ hi /" es igual a "// hi //". Útil para expresiones regulares y caminos.

PS2. El primer grupo se almacena en el Grupo [1], no en el Grupo [0] como cabría esperar. Eso es porque el Grupo [0] contiene toda la cadena coincidente.


Puedes usar paréntesis para capturar grupos de personajes:

string test = "RR1234566-001"; // capture 2 letters, then 7 digits, then a hyphen, then 1 or more digits string rx = @"^([A-Za-z]{2})(/d{7})(/-)(/d+)$"; Match m = Regex.Match(test, rx, RegexOptions.IgnoreCase); if (m.Success) { Console.WriteLine(m.Groups[1].Value); // RR Console.WriteLine(m.Groups[2].Value); // 1234566 Console.WriteLine(m.Groups[3].Value); // - Console.WriteLine(m.Groups[4].Value); // 001 return true; } else { return false; }


Utilice agrupación y coincidencias en su lugar.

Es decir:

// NOTE: pseudocode. Regex re = new Regex("(//d+)-(//d+)"); Match m = re.Match(stringToMatch)) if (m.Success) { String part1 = m.Groups[1].Value; String part2 = m.Groups[2].Value; return true; } else { return false; }

También puedes nombrar las coincidencias, así:

Regex re = new Regex("(?<Part1>//d+)-(?<Part2>//d+)");

y acceso como este

String part1 = m.Groups["Part1"].Value; String part2 = m.Groups["Part2"].Value;


string text = "RR1234566-001"; string regex = @"^([A-Z a-z]{2})(/d{7})(/-)(/d+)"; Match mtch = Regex.Matches(text,regex); if (mtch.Success) { Console.WriteLine(m.Groups[1].Value); Console.WriteLine(m.Groups[2].Value); Console.WriteLine(m.Groups[3].Value); Console.WriteLine(m.Groups[4].Value); return true; } else { return false; }