Sí, me gustaría escribir como este para evitar la ejecución de los partidos expresiones regulares varias veces:
match = Regex.Match(input, @"Type1|Type2|Type3");
if (match.Success)
{
// loop, in case you are matching to multiple occurrences within the input.
// However, Regex.Match(string, string) will only match to the first occurrence.
foreach (Capture capture in match.Captures)
{
// if you care to determine which one (Type1, Type2, or Type3) each capture is
switch (capture.Value)
{
case "Type1":
// ...
break;
case "Type2":
// ...
break;
case "Type3":
// ...
break;
}
}
}
Alternativamente, si usted tiene una lista arbitraria de los patrones que desea comprobar:
// assumption is that patterns contains a list of valid Regex expressions
match = Regex.Match(input, string.Join("|", patterns));
if (match.Success)
{
// obviously, only one of these return statements is needed
// return the first occurrence
return match.Captures[0].Value;
// return an IEnumerable<string> of the matched patterns
return match.Captures.OfType<Capture>().Select(capture => capture.Value);
}
Aquí hay otro enfoque que usa grupos de captura con nombre para indexar cada patrón. cuando se encuentra una coincidencia, intentamos determinar cuál de los grupos de captura se correspondió.
mucho me disgusta este código debido a la concatenación innecesaria repetida de "patrón" con el índice, pero no estoy seguro de cómo hacer esto más limpio:
EDIT: He limpiado este codifique un poco utilizando un diccionario
// assumption is that patterns contains a list of valid Regex expressions
int i = 0;
var mapOfGroupNameToPattern = patterns.ToDictionary(pattern => "Pattern" + (i++));
match = Regex.Match(input, string.Join("|", mapOfGroupNameToPattern.Select(x => "(?<" + x.Key + ">" + x.Value + ")")));
if (match.Success)
{
foreach (var pattern in mapOfGroupNameToPattern)
{
if (match.Groups[pattern.Key].Captures.Count > 0)
{
// this is the pattern that was matched
return pattern.Value;
}
}
}
Coloque las expresiones regulares en una lista y repita la lista hasta que llegue a una. – CodesInChaos
'Poner las expresiones regulares en una lista, y luego iterar sobre esa lista hasta llegar a one.' o escribir una expresión regular mejor como' Tipo 1 | Tipo 2 | Type3' –
@LB cómo averiguar qué parte de la expresión regular tuvo éxito cuando se combinan ¿ellos? Asumiendo que las expresiones regulares no son triviales. – CodesInChaos