Frage

Ist es möglich, einen ordnungsgemäß gebildeten Ausdruck zu konvertieren (in Bezug auf Klammern) wie z.

((a und b) oder c) und d

in einen Regex-Ausdruck und verwenden Sie Java oder die integrierte Engine einer anderen Sprache mit einem Eingangsbegriff wie ABCDE (Fall-unempfindlich ...)?

Bisher habe ich etwas in der Sicht von (b) ausprobiert(^.?)(a | e)* für die Suche b und (a oder e), aber es funktioniert nicht wirklich. Ich suche danach, dass es den Charakteren 'B' und einem von 'a' oder 'e' übereinstimmt, die in der Eingabezeichenfolge erscheinen.

Über den Prozess - ich denke darüber nach, die Eingangszeichenfolge in ein Array (basierend auf diesem Regex) aufzuteilen und als Ausgabe die Zeichen zu empfangen, die übereinstimmen (oder keine, wenn die und/oder Bedingungen nicht erfüllt sind). Ich bin relativ neu in Regex und habe nicht viel Zeit damit verbracht. Es tut mir leid, dass das, wonach ich frage, nicht möglich oder die Antwort wirklich offensichtlich ist.

Danke für alle Antworten.

War es hilfreich?

Lösung

Die Sprache der Strings mit ausgewogenen Klammern ist keine reguläre Sprache, was bedeutet, dass kein (reiner) regulärer Ausdruck ihr übereinstimmt.

Das liegt daran, dass eine Art Speicherkonstrukt, normalerweise ein Stapel, benötigt wird, um offene Klammern zu erhalten.

Viele Sprachen bieten jedoch eine rekursive Bewertung in Regexes, insbesondere Perl. Ich kenne die feinen Details nicht, aber ich werde mich nicht um sie kümmern, weil Sie wahrscheinlich Ihren eigenen Parser schreiben können.

Idieren Sie einfach jeden Charakter in der Saite und verfolgen Sie einen Zähler von offenen Klammern und einen Stapel Streicher. Wenn Sie zu einem offenen Klammern kommen, drücken Sie den Stapel hinein und legen Sie Charaktere, die keine Klammern in die Stapelzeichenfolge sind, ein. Wenn Sie zu einem geschlossenen Klammern kommen, bewerten Sie den Ausdruck, den Sie aufgebaut haben, und speichern das Ergebnis auf der Rückseite der Saite, die oben auf dem Stapel liegt.

Andererseits bin ich mir nicht ganz sicher, was Sie tun. Ich entschuldige mich dann, wenn dies keine Hilfe ist.

Andere Tipps

Ich bin nicht ganz sicher, dass ich verstehe, was Sie versuchen zu tun, aber hier ist etwas, das helfen könnte. Beginnen Sie mit so etwas wie

((a and b) or c) and d

Und geben Sie es durch diese Substitutionserklärungen:

s/or/|/g
s/and| //g
s/([^()|])/(?=.*$1)/g

Das wird dir geben

(((?=.*a)(?=.*b))|(?=.*c))(?=.*d)

Welches ist eine Regex, die zu dem passt, was Sie wollen.

Nein. Ein Regex ist nicht rechnerisch genug, um sicherzustellen, dass das Öffnen und Schließen von Klammern übereinstimmt. Sie brauchen etwas, das es mit einer formalen Grammatik beschreiben kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top