Rückverweis bezieht sich auf die Referenzierung der übereinstimmenden Gruppe auf andere Stellen im Ausdruck selbst. Wenn wir beispielsweise HTML-Tags abgleichen, stimmen wir mit einem <a> überein und müssen das übereinstimmende a in Anführungszeichen setzen, um </ a> zu finden. Dieses Mal benötigen Sie Rückreferenz verwenden.
Syntax
a. Um auf eine nummerierte Gruppe zurückzuverweisen,
lautet
die Syntax k<name>
Beispiel
a.
s>]+)[^>]*>.*</k<tag>>"
b. Übereinstimmung zweier überlappender Zeichen
public static void Main()
{
string s = "aabbc11asd";
Regex reg = neuer Regex(@"(w)1");
MatchCollection matches = reg.Matches(s);
foreach(Match m in Übereinstimmungen)
Console.WriteLine(m.Value);
Console.ReadLine();
}
Das Rückgabeergebnis ist aa bb 11
Hilfs-Matching-Gruppe
, die mehreren Gruppenstrukturen folgt. Das Muster in den Klammern wird nicht als Teil des Matching-Ergebnisses1
gespeichert
.Die Bedeutung der positiven Aussage (?=): Das Muster in den Klammern muss sein erscheinen auf der rechten Seite der Anweisung, aber nicht als Teil des Matches
public static void Main()
{
string s = "C#.net,VB.net,PHP,Java,JScript.net";
Regex reg = new Regex(@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach(Match m in mc)
Console.WriteLine(m.Value);
Console.ReadLine();
//C# VB JScript ausgeben
}
Sie können sehen, dass die Matching-Engine ein Matching mit .net erfordert, .net jedoch nicht in die Matching-Ergebnisse einfügt.
2.
Negative Deklaration (?!)
Bedeutung: Das Muster in Klammern darf nicht auf der rechten Seite der Deklaration erscheinen
Das folgende Beispiel zeigt, wie man einen < a>Alle Inhalte im Tag-Paar erhält, auch wenn es andere HTML-Tags enthält.
öffentliches statisches 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);
//Ergebnis: <a href="1.html"><img src="1.gif">test<span style="color:red;">Regex</span></a>
Console.ReadLine();
}
3.
Die Bedeutung der umgekehrten positiven Deklaration (?<=): Das Muster in Klammern muss auf der linken Seite der Deklaration erscheinen, aber nicht als Teil der Übereinstimmung
4. Die Bedeutung der umgekehrten negativen Deklaration (?<!)
: Das Muster in Klammern darf nicht auf der linken Seite der Anweisung angezeigt werden.
Nicht-Backtracking-Matching-
Syntax: (?>)
Bedeutung: Nachdem diese Gruppe abgeglichen wurde, können die übereinstimmenden Zeichen nicht für den Abgleich nachfolgender Ausdrücke durch Backtracking verwendet werden. Haha, ich werde es definitiv nicht verstehen, wenn ich nur diesen Satz lese. Ich habe viel Zeit damit verbracht, das zu verstehen, also lassen Sie es uns anhand eines Beispiels veranschaulichen:
" www.csdn.net " kann mit @"w+.(.*).w+" abgeglichen werden, aber nicht mit @"w+.(?>.*).w+"! Warum?
Der Grund dafür ist, dass beim Abgleich so viele Ergebnisse wie möglich gefunden werden. Daher stimmt der .* in den beiden regulären Ausdrücken im obigen Beispiel vollständig mit csdn.net überein Wenn es mit dem Abgleich beginnt, stellt es fest, dass .w+ keine Zeichen zum Abgleichen hat, also wird es zurückverfolgt. Das sogenannte Backtracking besteht darin, das .*-Übereinstimmungsergebnis zurückzuschieben und die verbleibenden Zeichen aus dem Pushback zum Abgleichen zu verwenden .w+ ,Bis .w+ erfolgreich übereinstimmt, gibt der gesamte Ausdruck ein erfolgreiches Übereinstimmungsergebnis zurück. Der zweite Ausdruck verwendet einen Nicht-Backtracking-Abgleich, sodass nach dem Abgleich von .* kein Abgleich mit .w+ durch Backtracking möglich ist, sodass der gesamte Ausdruck nicht übereinstimmt.
Bitte beachten Sie, dass das Zurückverfolgen eine Verschwendung von Ressourcen darstellt. Versuchen Sie daher, ein Zurückverfolgen zu vermeiden, um Ihren regulären Ausdruck erfolgreich abzugleichen. Wie im obigen Beispiel können Sie ihn durch @"w+.([^.]+ ersetzen. .)+w+"+".