2009-05-26 14 views
0

Wir müssen übereinstimmen.
RegexMuster Schalter Case-Anweisungen

Eine typische switch-Anweisung:

switch (a)
{
case "A":
case "B":
result = "T";
result1 = "F";
default: result = "F";
}

ich in der Lage gewesen, zwei Muster zu schaffen, in der ersten Stufe und den Fall Etiketten und Körper in der zweiten Stufe des Schalterkörpers anzupassen, aber ich bin auf der Suche nach einem einzigen Regex, mit dem ich Fallbezeichnungen und Körper extrahieren kann.

Wir haben keine verschachtelten Schalter.

Mit freundlichen Grüßen

+0

Sie Ihre Fälle conditionals oder Schleifen umfassen? Selbst ein {in einer Zeichenkette verursacht ein Problem. Es gibt wirklich keinen Weg, einen Parser zu verwenden. –

Antwort

3

Da Switch-Anweisungen können verschachtelt werden traditionelle Regexes sie nicht verarbeiten kann (Heck, auch die Tatsache, dass die {} bricht sie verschachtelt werden können). Regexes können nur Regular Languages analysieren. Sie benötigen eine Form von Parser, um Sprachen zu analysieren, die nicht regulär sind. Abhängig davon, welche Sprache Sie haben (es sieht wie C aus, aber auch viele Dinge), kann es bereits einen Parser geben, den Sie verwenden können (wie Sparse für C).

+0

Hallo, Wir haben keine verschachtelten Switches. –

1

ist hier etwas, mit zu beginnen, aber es ist bei weitem nicht perfekt - der Ausdruck nicht erkennt Ausfälle und das Ende der switch-Anweisung (und enthält vielleicht einige andere Fehler).

(?sn:(case (?<label>[^:]+):[ \r\n\t]*)+(?<body>((?!case).)*)) 

UPDATE

Es wird auch fehlschlagen, wenn der Körper case als Teil einer Zeichenfolge oder eine Kennung enthält.

0

Chas. Owens hat in seinem Kommentar Recht. Aber für einfache Fälle, können Sie vielleicht die folgende regex verwenden:

switch\s*\((?<expression>[^\)]+)\)\s*\{\s*((default(?<case>)|case\s*(?<case>"[^"]*"|'[^']*'|\w+))\s*:\s*(?<body>((?!\s*(case\b|default\b|\}))("[^"]*"|'[^']*'|[^\}]))*)\s*)+\} 

es zu verwenden, die Regex-Engine Sie verwenden sollten explizit mehrere benannte Captures unterstützen und Look-aheads (wie .NET Regex-Engine) . Beachten Sie, dass alle Gruppen mit Ausnahme der genannten Gruppen nicht erfasst werden können. Um die Regex jedoch leichter verständlich zu machen, habe ich beim Start der Gruppe nicht "?:" Hinzugefügt, um sie zu Gruppen zu machen, die nicht erfasst werden.

Sie werden dann mit den folgenden Aufnahmen ein Spiel für jeden erkannten switch Anweisung erhalten:

  • Ausdruck: den Ausdruck für den Schalter (1 capture) verwendet

  • Fall: der Fall Etikett oder leer ist (aber eine erfolgreiche capture) für den Standard

  • Körper: der Gehäusekörper, ein für jeden Fall

Fall und Körper wird immer als Paare kommen, so dass Sie durch die Aufnahmen aufzählen kann.