4 Stimmen

Regulärer Ausdruck für Kommentare, aber nicht innerhalb eines "Strings" / nicht in einem anderen Container

Ich brauche also einen regulären Ausdruck, um ein- und mehrzeilige Kommentare zu finden, aber nicht in einer Zeichenkette. (z.B.. "my /* string" )

zum Testen ( # eine Zeile, /* & */ Mehrzeiler):

# complete line should be found
lorem ipsum # from this to line end
/*
  all three lines should be found
*/ but not here anymore
var x = "this # should not be found"
var y = "this /* shouldn't */ match either"
var z = "but" & /* this must match */ "_"

SO macht die Syntaxanzeige wirklich gut; ich möchte im Grunde den ganzen grauen Text.
Es ist mir egal, ob es sich um eine einzelne Regex oder zwei Trennungen handelt ;)

EDIT: eine weitere Sache. das Gegenteil würde mich auch zufriedenstellen, die Suche nach einer Zeichenfolge, die nicht in einem Kommentar ist
Dies ist mein derzeitiges String-Matching: "[\s\S]*?(?<!\\)" (in der Tat: funktioniert nicht mit "\\" )

EDIT2:
OK endlich habe ich meinen eigenen Kommentarparser geschrieben -.-
Und falls noch jemand an dem Quellcode interessiert ist, kann er ihn hier herunterladen: https://github.com/relikd/CommentParser

7voto

mathematical.coffee Punkte 54672

Hier ist eine Möglichkeit (die allerdings eine Achillesferse hat, zu der ich noch kommen werde):

(#[^"\n\r]*(?:"[^"\n\r]*"[^"\n\r]*)*[\r\n]|/\*([^*]|\*(?!/))*?\*/)(?=[^"]*(?:"[^"]*"[^"]*)*$)

In Aktion ici

Mit den Flags GLOBAL und DOTALL, aber no das Kennzeichen MULTILINE.

Erläuterung der Regex:

(
  #[^"\n\r]*                         Hash mark followed by non-" and non-end-of-line
    (?:"[^"\n\r]*"[^"\n\r]*)*        If any quotes in the comment, they must be balanced
    [\r\n]                           Followed by end-of-line ($ except we 
                                      don't have multiline flag)

  |                                  OR
  /\*([^*]|\*(?!/))*?\*/             /* xxx */ sort of comment
  )                                  BOTH FOLLOWED BY
(?=[^"]*(?:"[^"]*"[^"]*)*$)           only a *balanced* number of quotes for the 
                                      *rest of the code :O!*

Allerdings ist diese stützt sich auf auf balancierte Anführungszeichen, die im gesamten Text verwendet werden (sie berücksichtigt auch keine maskierten Anführungszeichen, aber es ist einfach genug, die Regex zu ändern, um dies zu berücksichtigen).

Wenn ein Benutzer einen Kommentar mit einem " darin abgibt, der nicht ausgewogen ist...bumm. Du bist am Arsch!

Regex wird im Allgemeinen nicht für Dinge wie HTML/Code-Parsing empfohlen, aber wenn Sie sich darauf verlassen können, dass Anführungszeichen bei der Definition einer Zeichenkette usw. ausgeglichen werden müssen, können Sie manchmal damit auskommen.

Da Sie auch Parsing Kommentare die über keine feste Struktur (d.h. es ist nicht gewährleistet, dass Anführungszeichen innerhalb von Kommentaren ausgeglichen werden), werden Sie keine Regex-Lösung finden, die hier funktioniert.

Alles, was Sie sich ausdenken, kann durch ein unausgewogenes Zitat in einem Kommentar überlistet werden (sagen wir, der Kommentar war # remove all the " marks ) oder durch mehrzeilige Zeichenketten (in denen in einer bestimmten Zeile unsymmetrische Anführungszeichen stehen können).

Unterm Strich - können Sie wahrscheinlich eine Regex erstellen, die in den meisten Fällen funktioniert, aber nicht für alle. Um etwas Wasserdichtes zu bekommen, müssen Sie etwas Code schreiben.

0voto

Bruno Silva Punkte 3049

Ich würde dafür zwei reguläre Ausdrücke verwenden:

  1. /(\/\*.*?\/)|(#.+?$)/m um alle Kommentare zu finden, der Modifikator "m" aktiviert die Mehrzeiligkeit
  2. /"[^"]*?"/ um alle Zeichenketten zu finden

Wenn Sie die Hervorhebung zuerst auf die Kommentare und erst danach auf die Zeichenketten anwenden, sollten die ungültigen Kommentare verschwinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X