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?

0
John 23 feb. 2020 a las 18:20

2 respuestas

La mejor respuesta
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.

1
imlokesh 23 feb. 2020 a las 16:01

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;
0
ΩmegaMan 23 feb. 2020 a las 16:22