Wie entferne ich nachfolgende Kommentare über regexp?

8

Für Nicht-MATLAB-versierte Leser: nicht sicher, welcher Familie sie angehören, aber die MATLAB-Regexes werden beschrieben hier im Detail. Das Kommentarzeichen von MATLAB ist % (Prozent) und sein Trennzeichen für die Zeichenfolge ist ' (Apostroph). Ein String-Begrenzer in einem String wird als Doppelapostophe geschrieben ( 'this is how you write "it''s" in a string.' ). Um die Sache noch komplizierter zu machen, sind die Matrix-Transponieroperatoren auch Apostrophe ( A' (hermitesch) oder A.' (regulär)).

Nun, aus dunklen Gründen (die ich nicht ausführen werde), versuche ich den MATLAB-Code in MATLABs eigener Sprache zu interpretieren.

Momentan versuche ich, alle nachgestellten Kommentare in einem Zellen-Array von Strings zu entfernen, die jeweils eine Zeile MATLAB-Code enthalten. Auf den ersten Blick mag das einfach erscheinen:

%Vor%

Aber natürlich könnte so etwas kommen:

%Vor%

Offensichtlich müssen wir alle Kommentarzeichen, die in Strings liegen, von der Übereinstimmung ausschließen, wobei wir auch berücksichtigen, dass ein einzelnes Apostroph (oder ein Punktaposrotphe), das direkt auf eine Anweisung folgt, ein -Operator ist , kein String-Trennzeichen.

Ausgehend von der Annahme, dass die Anzahl der Zeichenketten zum Öffnen / Schließen vor sein muss, muss das Kommentarzeichen even sein (was aufgrund der Matrix-Transponierung unvollständig ist) Operator), habe ich den folgenden dynamischen Regex für diese Art von Fall heraufbeschworen:

%Vor%

Allerdings

%Vor%

also bin ich fast da, aber noch nicht ganz :) :)

Leider habe ich die Zeit, die ich damit verbringen kann, erschöpft und muss mit anderen Dingen fortfahren. Vielleicht ist jemand anderer, der mehr Zeit hat, freundlich genug, um über diese Fragen nachzudenken:

  1. Sind Kommentarzeichen innerhalb von Zeichenfolgen die einzige Ausnahme, auf die ich achten muss?
  2. Was ist der richtige und / oder effizientere Weg, dies zu tun?
Rody Oldenhuis 28.06.2013, 07:25
quelle

5 Antworten

4

Dies entspricht dem konjugierten Transponierungsfall, indem geprüft wird, welche Zeichen vor einem Zeichen zulässig sind.

  1. Zahlen 2'
  2. Buchstaben A'
  3. Punkt A.'
  4. Linke Klammer, Klammer und Klammer A(1)' , A{1}' und [1 2 3]'

Das sind die einzigen Fälle, an die ich jetzt denken kann.

%Vor%

in Ihrem Beispiel wir es zurück

%Vor%     
Mohsen Nosratinia 28.06.2013, 09:57
quelle
5

Was halten Sie von nicht dokumentierten Funktionen? Wenn Sie nichts dagegen haben, können Sie die Funktion mtree verwenden, um den Code zu analysieren und die Kommentare zu entfernen. Es sind keine Regexps beteiligt, und wir alle wissen , dass wir nicht versuchen sollten, kontextfreie Grammatiken mit regulären Ausdrücken zu analysieren.

Diese Funktion ist ein vollständiger Parser von MATLAB-Code, der in reinem M-Code geschrieben ist. Soweit ich das beurteilen kann, handelt es sich um eine experimentelle Implementierung, die aber bereits von Mathworks an einigen Stellen verwendet wird (dies ist die gleiche Funktion wie in MATLAB Cody und Wettbewerbe Code-Länge) und kann für andere nützliche Dinge verwendet werden.

Wenn die Eingabe ein String String ist, tun wir:

%Vor%

Wenn Sie bereits eine M-Datei auf der Festplatte gespeichert haben, können Sie die Kommentare einfach wie folgt streichen:

%Vor%

Wenn Sie die Kommentare zurück sehen möchten, fügen Sie hinzu: mtree(.., '-comments')

    
Amro 28.06.2013 17:10
quelle
4

Schau, was ich gefunden habe! :)

Die Toolbox zum Entfernen von Kommentaren , von Peter J. Acklam.

Für M-Code enthält es die folgende Regex:

%Vor%

Was wird

? %Vor%

und sollte als

verwendet werden %Vor%

Bisher hat es alle meine Tests überstanden, also denke ich, das sollte mein Problem recht gut lösen:)

    
Rody Oldenhuis 28.06.2013 14:07
quelle
2

Ich bevorzuge es, checkcode zu missbrauchen (der Ersatz für das alte mlint ), um das Parsing durchzuführen. Hier ist ein Vorschlag

%Vor%

Für jede Zeile wird überprüft, ob ein Fehler auftritt, indem die Zeile vom letzten % bis zum Ende der Zeile abgeschnitten wird.

Für Ihr Beispiel gibt es zurück:

%Vor%

Die Unterdrückungs-Direktive %#ok wird nicht entfernt. Sie erhalten also:

%Vor%

Was wahrscheinlich eine gute Sache ist.

    
Mohsen Nosratinia 28.06.2013 08:52
quelle
1

Wie wäre es damit sicherzustellen, dass alle Apostrophe vor dem Kommentar paarweise so kommen:

%Vor%     
ahilsend 28.06.2013 08:23
quelle

Tags und Links