La référence arrière fait référence au référencement du groupe correspondant à d'autres endroits dans l'expression elle-même. Par exemple, lors de la correspondance des balises HTML, nous faisons correspondre un <a> et nous devons citer le a correspondant pour trouver </ a>, cette fois vous en avez besoin. pour utiliser la référence arrière.
Syntaxe
a. Pour référencer un groupe numéroté, la syntaxe est number
b. Pour référencer un groupe nommé, la syntaxe est k<name>
Exemple
a. Faire correspondre les balises HTML appariées
@"<(?<tag>[^ s>]+)[^>]*>.*</k<tag>>"
b. Faire correspondre deux caractères qui se chevauchent
public static void Main()
{
chaîne s = "aabbc11asd" ;
Regex reg = nouvelle Regex (@"(w)1");
Correspondances MatchCollection = reg.Matches(s);
foreach(Match m dans les matchs)
Console.WriteLine(m.Value);
Console.ReadLine();
}
Le résultat renvoyé est un
groupe de correspondance auxiliaire
aa bb 11suivant plusieurs structures de groupe, le motif entre parenthèses ne sera pas enregistré dans le cadre du résultat de correspondance
1.
La signification de l'instruction positive (?=) : le motif entre parenthèses doit apparaître sur le côté droit de la déclaration, mais pas dans le cadre de la correspondance
public static void Main()
{
chaîne s = "C#.net,VB.net,PHP,Java,JScript.net" ;
Regex reg = new Regex (@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach (Correspond à m dans mc)
Console.WriteLine(m.Value);
Console.ReadLine();
//Sortie C# VB JScript
}
Vous pouvez voir que le moteur de correspondance nécessite une correspondance .net, mais ne met pas .net dans les résultats de correspondance.
2. Déclaration négative (?!)
signifiant : le motif entre parenthèses ne doit pas apparaître à droite de la déclaration
. L'exemple suivant montre comment obtenir un contenu < a>Tout dans la paire de balises, même s'il contient d'autres balises HTML.
public static void Main()
{
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).Value);
//Résultat : <a href="1.html"><img src="1.gif">test<span style="color:red;">Regex</span></a>
Console.ReadLine();
}
3.
La signification de la déclaration positive inverse (?<=) : le motif entre parenthèses doit apparaître sur le côté gauche de la déclaration, mais pas dans le cadre de la correspondance
4. La signification de la déclaration négative inverse (?<!)
: le modèle entre parenthèses ne doit pas être utilisé. Syntaxe
de correspondance sans retour en arrière
apparaissant sur le côté gauche de l'instruction: (?>)
Signification : Une fois ce groupe mis en correspondance, les caractères correspondants ne peuvent pas être utilisés pour faire correspondre les expressions suivantes via le retour en arrière. Haha, je ne comprendrai certainement pas rien qu'en lisant cette phrase. J'ai passé beaucoup de temps à essayer de comprendre cela, alors illustrons-le à travers un exemple :
" www.csdn.net " peut être mis en correspondance par @"w+.(.*).w+", mais ne peut pas être mis en correspondance par @"w+.(?>.*).w+" ! Pourquoi?
La raison en est que la correspondance régulière est gourmande. Lors de la correspondance, elle correspondra à autant de résultats que possible. Par conséquent, le .* dans les deux expressions régulières de l'exemple ci-dessus correspondra complètement à csdn.net. in Lorsqu'il commence la correspondance, il constate que .w+ n'a aucun caractère à faire correspondre, il fera donc marche arrière. Ce qu'on appelle le retour en arrière consiste à repousser le résultat de la correspondance .*, et les caractères restants du refoulement sont utilisés pour correspondre. .w+ ,Jusqu'à ce que .w+ corresponde avec succès, l'expression entière renvoie un résultat de correspondance réussi. La deuxième expression utilise une correspondance sans retour en arrière, donc une fois que .* est mis en correspondance, il n'est pas autorisé à faire correspondre .w+ via un retour en arrière, donc l'expression entière ne parvient pas à correspondre.
Veuillez noter que le retour en arrière est un gaspillage de ressources, alors essayez d'éviter de devoir revenir en arrière pour faire correspondre votre expression régulière. Comme dans l'exemple ci-dessus, vous pouvez la remplacer par @"w+.([^.]+ . .)+w+"+".