2016-08-07 73 views
1

Ich arbeite an Java-Code-Syntax Hervorhebung in Android (Editext).Regex - wählen Sie keine Kommentare in Anführungszeichen

Verwenden von Regex zum Hervorheben von Schlüsselwörtern, Literalen, Strings und Zahlen.

Regex ist mit String String regex markieren: "\"(.*?)\"|'(.*?)'"

Kommentar regex: "/\\*(?:.|[\\n\\r])*?\\*/|//.*+\\/\\/.*"

Reihenfolge der regex Auswahl ist Schlüsselwörter regex ........... String regex und letzter Kommentar Regex.

Above regex ist dabei die richtige Auswahl der normalen Zeichenfolge und Kommentare, aber ..

Problem ist

Kommentare in doppelten Anführungszeichen auch hervorgehoben bekommen. Ich möchte die Kommentarauswahl in doppelten Anführungszeichen ignorieren.

Bitte gehen Sie durch das Bild für ein besseres Verständnis des Problems (erwartete Ausgabe) Wer Hilfe oder Anleitung wird enter image description here

+0

Geben Sie uns einige Beispiele für die Eingabe und erwartete Ausgabe/Highlight wäre nett :) –

+0

@NikolasCharalambidis danke für schnelle Antwort. Ich habe die Frage mit Bild aktualisiert. bitte schauen Sie es sich an :) –

+0

Ich weiß nicht, wie Editext funktioniert, aber haben Sie versucht, Ihre Regeln zu tauschen? Diese Arten von Hervorhebungsmaschinen bieten sicherlich Möglichkeiten, eine Rangordnung zu definieren. –

Antwort

3

Für mich zu erkennen ist, wie es scheint, Sie sind einfach für alle Spiele jeder regex suchen. Wenn eine Regex übereinstimmt, färben Sie die Übereinstimmung. Sie überschreiben also die Farbe eines vorherigen Spiels mit der Farbe des letzten Spiels.

Um dieses Problem zu lösen, müssen Sie einen geeigneten Lexer verwenden, der in der Lage ist, einen gegebenen Eingabetext in einen Tokenstrom zu übersetzen. Dann können Sie den Token-Stream durchlaufen und wenn Sie auf ein Token stoßen, das eingefärbt werden muss, können Sie dies tun.

Dies verhindert das aktuelle Problem, dass ein Teil des Eingabetextes durch mehrere Regex übereinstimmt und somit mehrfach gefärbt ist. Es verhindert dies, weil jedes Zeichen des Eingabetextes genau einem Token im Token-Stream zugeordnet ist.


Ein Lexer, dass der erste längste Match-Algorithmus funktioniert wie folgt verwendet: Es wird nach allen Regex-Übereinstimmungen, die am Anfang des Eingabetextes beginnen. Es wählt die Regex mit der längsten Übereinstimmung aus. Wenn mehrere Regex die längste Übereinstimmung teilen, wählt sie die erste aus. Jetzt erstellt der Lexer das erste Token des Token-Streams. Das Token besteht aus dem Tokentyp (der durch die Regex gegeben wird), der Startposition des Matches und der Endposition des Matches. Als nächstes sucht der Lexer nach dem nächsten Token, indem er das obige erneut ausführt. Dieses Mal sucht es jedoch nach Übereinstimmungen, die an der Endposition des vorherigen Tokens beginnen. Der Lexer tut dies, bis der gesamte Eingabetext in einen Token-Stream umgewandelt wurde oder bis er auf eine ungültige Eingabe stößt.

Der wichtige Teil hier ist, dass die Endposition von Token n und die Startposition von Token n + 1 die gleiche ist. Somit gibt es keine Überlappung und somit gibt es immer nur eine Farbe.