Heim  >  Artikel  >  Backend-Entwicklung  >  .net c# regulärer Ausdruck, ausgeglichene Gruppe/rekursiver Abgleich

.net c# regulärer Ausdruck, ausgeglichene Gruppe/rekursiver Abgleich

巴扎黑
巴扎黑Original
2016-12-19 16:32:111585Durchsuche

.net c# Ausgeglichene Gruppe/rekursiver Abgleich mit regulären Ausdrücken

Ausgeglichene Gruppe/rekursiver Abgleich

Die hier eingeführte ausgeglichene Gruppensyntax wird vom .Net Framework nicht unterstützt Diese Funktionalität muss unterstützt werden, oder sie wird möglicherweise unterstützt, verwendet jedoch eine andere Syntax.

Manchmal müssen wir eine verschachtelbare hierarchische Struktur wie (100 * (50 + 15)) abgleichen. In diesem Fall wird durch die einfache Verwendung von (.+) nur die Klammer ganz links und der Inhalt zwischen der Klammer ganz rechts abgeglichen Klammern (hier diskutieren wir den Greedy-Modus, der Lazy-Modus hat auch die folgenden Probleme). Wenn die Anzahl der Vorkommen der linken Klammer und der rechten Klammer in der ursprünglichen Zeichenfolge nicht gleich ist, z. B. (5 / (3 + 2))), dann ist die Anzahl der beiden in unserem Übereinstimmungsergebnis nicht gleich. Gibt es eine Möglichkeit, den längsten übereinstimmenden Inhalt zwischen Klammern in einer solchen Zeichenfolge abzugleichen?

Um zu vermeiden, dass ( und ( Ihr Gehirn völlig verwirren, verwenden wir spitze Klammern anstelle von runden Klammern. Jetzt geht es um die Frage, wie man xx in einer Zeichenfolge wie ersetzt aa> yy, wie wird der Inhalt innerhalb des längsten spitzen Klammerpaars erfasst?

Die folgende grammatikalische Struktur muss hier verwendet werden:

(?'group') Der erfasste Inhalt wird benannt Gruppe und in den Stapel verschoben (Stapel)
(?'-group') Entnimmt den erfassten Inhalt mit dem Namen „Gruppe“, der zuletzt in den Stapel verschoben wurde, vom Stapel. Wenn der Stapel ursprünglich leer ist, ist der Abgleich der Gruppe fehlgeschlagen
(?(Gruppe)Ja|Nein) Wenn sich auf dem Stapel Erfassungsinhalt mit dem Namen Gruppe befindet, stimmen Sie weiterhin mit dem Ja-Teil des Ausdrucks überein, andernfalls stimmen Sie weiterhin mit dem Nein-Teil überein. Da es keinen Suffixausdruck gibt, schlägt der Versuch einer Übereinstimmung immer fehl
Wenn Sie kein Programmierer sind (oder sich selbst Programmierer nennen, aber nicht wissen, was ein Stapel ist), können Sie die oben genannten drei Syntaxen wie folgt verstehen: Die Die erste besteht darin, eine „Gruppe“ an die Tafel zu schreiben, die zweite darin, eine „Gruppe“ von der Tafel zu löschen, und die dritte darin, zu prüfen, ob noch „Gruppe“ an die Tafel geschrieben ist, und wenn ja, mit dem Abgleich fortfahren der Ja-Teil. Ansonsten passen Sie den Nein-Teil an.

Was wir tun müssen, ist jedes Mal, wenn wir auf eine linke Klammer stoßen, ein „Öffnen“ zu drücken, jedes Mal, wenn wir auf eine rechte Klammer stoßen, ein „Öffnen“ zu drücken Der Stapel am Ende ist leer. Wenn er nicht leer ist, bedeutet dies, dass mehr linke als rechte Klammern vorhanden sind und die Übereinstimmung fehlschlägt. Die Engine für reguläre Ausdrücke wird zurückverfolgt (einige der ersten oder letzten Zeichen werden aufgegeben). ), um zu versuchen, den gesamten Ausdruck zu erhalten.



Code kopieren
<                          ;) #Wenn Sie auf eine linke Klammer stoßen, schreiben Sie „Öffnen“ an die Tafel
[^<>]* #Passen Sie die linke Klammer an Was folgt, ist nicht der Inhalt der Klammern
) +
( # Passen Sie den Inhalt an, der keine Klammer nach der rechten Klammer ist
)+
)*
(?(Open)(?!)) #Bevor Sie auf die äußerste rechte Klammer stoßen, stellen Sie fest, ob dort etwas steht Sonst auf der Tafel „Offen“, die noch nicht gelöscht wurde; wenn noch eines vorhanden ist, schlägt die Anwendung fehl. Das folgende Beispiel kann verschachtelte

-Tags abgleichen
]*>[^<>] *(((?'Open']*>)[^<>]*) +((?'-Open'
)[^<>] *)+)*(?(Open)(?!))

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:.net-VerschlüsselungsalgorithmusNächster Artikel:.net-Verschlüsselungsalgorithmus

In Verbindung stehende Artikel

Mehr sehen