La referencia hacia atrás se refiere a hacer referencia al grupo coincidente a otros lugares en la expresión misma. Por ejemplo, al hacer coincidir etiquetas HTML, hacemos coincidir un <a>, y necesitamos citar la a coincidente para encontrar </ a>, esta vez es necesario. para utilizar referencia retrospectiva.
Sintaxis
a. Para hacer referencia a un grupo numerado, la sintaxis es número
b. Para hacer referencia a un grupo con nombre, la sintaxis es k<nombre>
Ejemplo
a. Emparejar etiquetas HTML
@"<(?<etiqueta>[^ s>]+)[^>]*>.*</k<tag>>"
b. Haga coincidir dos caracteres superpuestos
public static void Main()
{
cadena s = "aabbc11asd";
Regex reg = nueva expresión regular (@"(w)1");
Coincidencias de MatchCollection = reg.Matches(s);
foreach(Coincidencia m en coincidencias)
Consola.WriteLine(m.Value);
Consola.ReadLine();
}
El resultado devuelto es un
grupo coincidente auxiliar
aa bb 11que sigue varias estructuras de grupo, el patrón entre paréntesis no se guardará como parte del resultado coincidente
1.
El significado de la declaración positiva (?=): el patrón entre paréntesis debe aparecer en el lado derecho de la declaración, pero no como parte de la coincidencia
public static void Main()
{
cadena s = "C#.net,VB.net,PHP,Java,JScript.net";
Regex reg = new Regex(@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach(Hacer coincidir m en mc)
Consola.WriteLine(m.Value);
Consola.ReadLine();
//Salida C# VB JScript
}
Puede ver que el motor de coincidencia requiere .net coincidente, pero no incluye .net en los resultados de coincidencia.
2. Declaración negativa (?!)
: El patrón entre paréntesis no debe aparecer en el lado derecho de la declaración
. El siguiente ejemplo demuestra cómo obtener < a>Todo el contenido del par de etiquetas, incluso si contiene otras etiquetas HTML.
vacío estático público principal ()
{
cadena noticiasContenido = @"url:<a href=""1.html""><img src=""1.gif"">prueba<span style=""color:red;"">Regex</span> </a>.";
Regex regEnd = new Regex(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline) ;
Console.WriteLine(regEnd.Match(noticiasContenido).Value);
//Resultado: <a href="1.html"><img src="1.gif">test<span style="color:red;">Regex</span></a>
Consola.ReadLine();
}
3.
El significado de la declaración positiva inversa (?<=): el patrón entre paréntesis debe aparecer en el lado izquierdo de la declaración, pero no como parte de la coincidencia
4. El significado de la declaración negativa inversa (?<!)
: el patrón entre paréntesis no debe aparecer Sintaxis
de coincidencia sin retroceso
en el lado izquierdo de la declaración: (?>)
Significado: después de que se haga coincidir este grupo, los caracteres coincidentes no se pueden usar para hacer coincidir expresiones posteriores mediante el retroceso. Jaja, definitivamente no lo entenderé con solo leer esta oración. Pasé mucho tiempo tratando de entender esto, así que ilustrémoslo con un ejemplo:
" www.csdn.net " puede coincidir con @"w+.(.*).w+", ¡pero no puede coincidir con @"w+.(?>.*).w+"! ¿Por qué?
La razón es que la coincidencia regular es codiciosa. Al comparar, coincidirá con tantos resultados como sea posible. Por lo tanto, el .* en las dos expresiones regulares del ejemplo anterior coincidirá completamente con csdn.net. en Cuando comienza a coincidir, descubre que .w+ no tiene caracteres que coincidir, por lo que retrocederá. El llamado retroceso consiste en hacer retroceder el resultado coincidente .*, y los caracteres restantes del retroceso se utilizan para hacer coincidir. .w+ ,Hasta que .w+ coincida correctamente, la expresión completa devuelve un resultado coincidente exitoso. La segunda expresión utiliza una coincidencia sin retroceso, por lo que después de que se haga coincidir .*, no se permite hacer coincidir .w+ mediante el seguimiento hacia atrás, por lo que la expresión completa no coincide.
Tenga en cuenta que retroceder es un desperdicio de recursos, así que intente evitar tener que retroceder para hacer coincidir correctamente su expresión regular. Como en el ejemplo anterior, puede reemplazarla con @"w+.([^.]+ . .)+w+"+".