2017-02-07 4 views
0

Ich möchte eine Übereinstimmung haben, wenn eine Klammer/Klammer nicht geschlossen ist, oder wenn eine geschlossen ist, aber nicht geöffnet, einschließlich verschachtelt (mit Notepad ++ Regex-Suche) .Regex - Überprüfen Sie eine Klammer/Klammer ist nicht geschlossen (einschließlich verschachtelt)

Zum Beispiel:

[Text] (ok)

[Text (nicht ok)

Text] (nicht ok)

[Text (test] (nicht ok)

[Text test)] (nicht ok)

[Text (test)] (ok)

Es könnte schön sein, wenn ich das gleiche mit den {und} machen kann.

Kannst du mir bitte helfen?

Danke!

Antwort

2

Es ist sicherlich besser, die Zeichenfolge zu analysieren, doch ist hier eine Möglichkeit, den Job mit Notepad ++

Sie vier mögliche Strings entsprechen haben zu tun:

1 Konsole öffnen, ohne die Nähe:

^.*?\[(?!.*?\])[^\]]*$ 

^  : begining of string 
    .*?  : 0 or more any char, not greedy 
    \[  : open bracket 
    (?!  : negative lookahead 
     .*? : 0 or more any char, not greedy 
     \] : close braket 
    )  : end lookahead 
    [^\]]* : 0 or more any char but close braket 
    $   : end of string 

2 schließen Halterung ohne offene:

^[^[\r\n]*\].*?$ 

^  : begining of string 
    [^[\r\n]* : O or more any char, except open bracket and linebreak 
    \]  : close bracket 
    .*?  : 0 or more any char 
    $   : end of string 

3 offene Mutter hesis ohne enge, gleiche Erklärung als Klammer auf:

^.*?\((?!.*?\))[^)]*$ 

4 schließende Klammer ohne offene, gleiche Erklärung als Klammer zu:

^[^(\r\n]*\).*?$ 

lasse ich Ihnen das Gleiche tun für { und }.

alle zusammen sie, zusammen mit |:

^(?:.*?\[(?!.*?\])[^\]]*|[^[\r\n]*\].*?|.*?\((?!.*?\))[^)]*|[^(\r\n]*\).*?)$ 
+0

Es ist einfach toll, vielen Dank, es behandelt alle meine Fälle! I – Baakan

+0

@Baakan: Gern geschehen, froh, dass es hilft – Toto

1

Es ist nicht möglich, es zu tun, indem Sie eine regex: die Klasse der Sprachen, die von DFAs anerkannt (Sprachen vom Typ 3-Deterministic Finite Automaton) durch reguläre Ausdrücke ausgedrückt werden, aber Sie brauchen einen PDA (Sprachen des Typs-2 - Push Down Automaton) zu simulieren um passende Klammern zu kontrollieren.

Es ist formal bewiesen, dass es nicht über Regex möglich ist.

Eine einfache Lösung ist, einen Zähler zu 0 initialisiert verwenden: Scannen Sie die Zeichenfolge und es jedes Mal, wenn Sie es finden, erhöhen Sie eine ) finden jedes Mal eine ( oder zu verringern.

Wenn der Zähler unter Null geht, ist der Ausdruck nicht gut gebildet.

Ich empfehle Ihnen, nur eine Art von Klammern zu verwenden, sonst benötigen Sie einen Zähler für jede Art von Klammern und einige Steueranweisungen.

+0

Vielen Dank für Ihre Antwort. Oh, schlecht:/Es liegt an den verschachtelten Fällen? Gibt es eine Lösung, ohne sie zu berücksichtigen? – Baakan

+0

Der Grund kommt von der Theorie der formalen Sprache und es wird kurz in den Seiten erklärt, die ich dich verband. Die einfachste Lösung ist diejenige, die ich Ihnen gezeigt habe, verwenden Sie nur '(' und ')'. Wenn Sie mehr Arten von Klammern zusammenbringen möchten, haben Sie 2 Lösungen: Sie können einen Stapel simulieren oder, wenn Sie nicht damit vertraut sind, können Sie für jeden Typ einen Zähler nehmen und die richtigen Kontrollen vornehmen. – pierlauro

+0

Danke, ich werde mir die Zeit nehmen, es zu lesen! – Baakan

Verwandte Themen