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