A referência anterior refere-se à referência do grupo correspondente a outros locais na própria expressão. Por exemplo, ao combinar tags HTML, correspondemos a um <a> e precisamos citar o a correspondente para encontrar </ a>, desta vez você precisa. para usar referência retroativa.
Sintaxe
a. Para fazer referência a um grupo numerado, a sintaxe é number
b. Para fazer referência a um grupo nomeado, a sintaxe é k<name>
Exemplo
a
.
s>]+)[^>]*>.*</k<tag>>"
b. Combine dois caracteres sobrepostos
public static void Main()
{
strings = "aabbc11asd";
Registro Regex = novo Regex(@"(w)1");
MatchCollection correspondências = reg.Matches(s);
foreach(Correspondência m em partidas)
Console.WriteLine(m.Valor);
Console.ReadLine();
}
O resultado retornado é um
grupo de correspondência auxiliar
bb 11seguindo várias estruturas de grupo, o Padrão entre colchetes não será salvo como parte do resultado de correspondência
1.
O significado da afirmação positiva (?=): o padrão entre colchetes deve aparecem no lado direito da instrução, mas não como parte da correspondência
public static void Main()
{
strings = "C#.net,VB.net,PHP,Java,JScript.net";
Regex reg = new Regex(@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach (corresponde m em mc)
Console.WriteLine(m.Valor);
Console.ReadLine();
//Saída C# VB JScript
}
Você pode ver que o mecanismo de correspondência requer .net correspondente, mas não coloca .net nos resultados correspondentes
2. Declaração negativa (?!)
significando: o padrão entre colchetes não deve aparecer no lado direito da declaração
. O exemplo a seguir demonstra como obter um < a>All content no par de tags, mesmo que contenha outras tags HTML.
público estático vazio Principal()
{
string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;"">Regex</span> </a>.";
Regex regEnd = new Regex(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline) ;
Console.WriteLine(regEnd.Match(newsContent).Valor);
//Resultado: <a href="1.html"><img src="1.gif">test<span style="color:red;">Regex</span></a>
Console.ReadLine();
}
3.
O significado da declaração positiva reversa (?<=): o padrão entre colchetes deve aparecer no lado esquerdo da declaração, mas não como parte da correspondência
4. O significado da declaração negativa reversa (?<!)
: o padrão entre colchetes não deve ser a sintaxe
de correspondência sem retrocesso
que aparece no lado esquerdo da instrução: (?>)
Significado: após a correspondência deste grupo, os caracteres correspondentes não podem ser usados para correspondência de expressões subsequentes por meio de retrocesso. Haha, definitivamente não vou entender só de ler essa frase. Passei muito tempo tentando entender isso, então vamos ilustrar com um exemplo:
" www.csdn.net " pode ser correspondido por @"w+.(.*).w+", mas não pode ser correspondido por @"w+.(?>.*).w+"! Por que?
A razão é que a correspondência regular é gananciosa. Ao corresponder, ela corresponderá ao maior número possível de resultados. Portanto, o .* nas duas expressões regulares no exemplo acima corresponderá completamente a csdn.net. in Quando começa a correspondência, ele descobre que .w+ não tem caracteres para corresponder, então ele retrocederá. O chamado retrocesso é retroceder o resultado da correspondência .* e os caracteres restantes do pushback são usados para corresponder. .w+ ,Até que .w+ corresponda com sucesso, a expressão inteira retorna um resultado de correspondência bem-sucedido. A segunda expressão usa correspondência sem retrocesso, portanto, após .* ser correspondido, não é permitido corresponder .w+ por meio de retrocesso, portanto, a expressão inteira falha na correspondência.
Observe que retroceder é um desperdício de recursos, portanto, tente evitar ter que retroceder para corresponder com êxito à sua expressão regular. Como no exemplo acima, você pode substituí-lo por @"w+.([^.]+ . .)+w+"+".