La clase Match
tiene una propiedad de nombre, pero siempre es "0"
.
En particular,
Regex.Matches("abcd", "b|d")
Da dos coincidencias que solo se pueden distinguir por valor. Lo mismo con los reemplazos:
Regex.Replace("abcd", "b|d", m => m.Name) // gives a0b0
Esto anterior da a0b0
, por lo que el nombre no los diferencia, ni nada más en la clase Match
.
Otros grupos tampoco ayudan, ya que
Regex.Replace("abcdef", "(b)|(d)|(f)", m => m.Groups.Count.ToString())
Da a4c4e4
, por lo que en cada evaluación del partido todos los grupos son iguales en el partido.
Eso significa que si bien es posible usar la cadena realmente coincidente , es decir. el valor, no es posible saber nada más sobre él, como qué subpatrón en la expresión regular con el que se hizo coincidir.
Esto es necesario para ejecutar múltiples reemplazos diferentes con una llamada de reemplazo, que es potencialmente mucho más rápido que usar una llamada de reemplazo por patrón, si hay muchos patrones de reemplazo.
¿Es correcta esta triste conclusión o me estoy perdiendo algo?
2 respuestas
Regex.Replace("abcdef", "(b)|(d)|(f)", m => m.Groups.Values.Skip(1).First(g => g.Success).Name)
Esto le dará a1c2e3
, que es probablemente lo que desea si entendí su pregunta correctamente.
Debe omitir m.Groups[0]
porque es igual para todas las coincidencias. Y m.Groups
contiene todos los grupos en su expresión regular original, independientemente de si coinciden o no. Para que pueda filtrar el grupo por éxito como en el código anterior.
Uno puede nombrar grupos de captura coincidentes usando este patrón
(?<YourValueHere>.+)
Y luego extraer como tal
myMatch.Group["YourValueHere"].Value
Esto es útil cuando indexar en una coincidencia puede ser problemático como este
((abc)|(def))? (GHI)
¿El índice del grupo de coincidencias de la captura "GHI" será 1 o 2? Para evitar ese nombre, las coincidencias como
((?<Name>abc)|(?<Rank>def))? (?<SerialNumber>GHI)
Entonces puedes verificar / extraer como tal
if (myMatch.Group["Rank"].IsSuccess)
rank = myMatch.Group["Rank"].Value
var SerialNumber = myMatch.Group["SerialNumber"].Value;
Preguntas relacionadas
Nuevas preguntas
.net
NO lo use para preguntas sobre .NET Core - use [.net-core] en su lugar. .NET Framework es un marco de software diseñado principalmente para el sistema operativo Microsoft Windows. Incluye una implementación de la Biblioteca de clases base, Common Language Runtime (comúnmente denominado CLR), Common Type System (comúnmente denominado CTS) y Dynamic Language Runtime. Es compatible con muchos lenguajes de programación, incluidos C #, VB.NET, F # y C ++ / CLI.