Frage

Hallo,

Hintergrund:

Ich bin mit Check 4.4.2 mit einem Modul RegExp-Checker zu erkennen, wenn der Dateiname in aus Java-Source-Header, in dem sie sich befinden, nicht den Dateinamen der Klasse oder Schnittstelle entsprechen. Dies kann passieren, wenn ein Entwickler Kopien einen Header von einer Klasse zur anderen und nicht die „Datei:“ nicht verändert. Tag

Der reguläre Ausdruck Verwendung in der RexExp Prüfung wurde durch viele Inkarnationen und (obwohl es vielleicht übertrieben an dieser Stelle) sieht wie folgt aus:

File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface )\1)

Die Grundform von Dateien, die ich (wenn auch stark vereinfacht) bin Überprüfung sieht wie folgt aus

/*
 *
 *  Copyright 2009
 *  ...
 *  File: Bar.java
 *  ... 
 */
package foo
... 
import ..
...
/**
 * ...
 */
public class Bar
{...} 

Das Problem:

Wenn keine Übereinstimmung gefunden wird , (dh wenn ein Header mit „File: Bar.java“ in der Datei Bat.java kopiert wird) ich eine Stackoverflow erhalte auf sehr langen Dateien (mein Testfall @ 1300 Linien).

habe ich mit mehreren visuellen regulären Ausdruck Tester experimentiert und kann, dass in der nicht passenden Fall siehe , wenn die Regex-Engine übergibt die Leitung der Klasse oder Schnittstelle Namen enthält es beginnt wieder in der nächsten Zeile der Suche und hat einige Rückzieher, die wahrscheinlich die Stackoverflow

Ursachen

die Frage:

Wie die Stackoverflow verhindern, indem sie den regulären Ausdruck modifiziert

Gibt es eine Möglichkeit, meinen regulären Ausdruck so zu modifizieren, dass in dem nicht passenden Fall (dh wenn ein Header mit „File: Bar.java“ kopiert wird in Datei Bat.java), dass die Anpassungs aufhören würde, sobald es die Zeile untersucht die Schnittstelle oder Klassennamen enthält und sieht, dass „\ 1“ nicht die erste Gruppe entsprechen.

Alternativ, wenn das getan werden kann, ist möglich, die Suche und Matching minimiert, die stattfinden, nachdem sie die Zeile mit der Schnittstelle oder Klasse und minimiert so die Verarbeitung und (hoffentlich) den Fehler untersucht Stackoverflow?

War es hilfreich?

Lösung

Versuchen

File: (\w+)\.java\n.*^[\w \t]+(?:class|interface) \1

in Punkt-matches-All-Modus. Begründung:

[\w\s] (die | nicht dort hingehören) passt alles, einschließlich Zeilenumbrüche. Dies führt zu einer viel Rückzieher bis in die Linien zurück, die die vorherigen Teil der regex abgestimmt hatte.

Wenn Sie die gierigen Punkt lassen alles verschlingen bis zum Ende der Datei (schnell) und dann denselben Weg zurückverfolgen, bis Sie eine Zeile finden, die mit Worten oder Leerzeichen / Tabs beginnt (aber ohne Zeilenumbrüche) und dann class oder interface und \ 1, das bedeutet dann nicht so viel Stack-Speicher benötigen.

Eine andere, und wahrscheinlich noch bessere Lösung wäre, das Problem in Teile aufzuspalten.

Zuerst den File: (\w+)\.java Teil entsprechen. Dann eine zweite Suche mit ^[\w \t]+(?:class|interface) plus der \1 Spiel von der ersten Suche auf der gleichen Datei.

Andere Tipps

Follow-up:

angeschlossen ich in Tim Pietzcher Vorschlag oben und seine gierige Lösung in die Tat versäumte schneller und ohne Stackoverflow, wenn keine Übereinstimmung gefunden wurde. Doch im positiven Fall die Stackoverflow noch aufgetreten.

Ich habe einen Blick auf den Quellcode RegexpCheck.java . Die Klassen Muster werden in mehrzeiligen Modus so konstruiert, dass die Ausdrücke ^ und $ paßt kurz nach oder kurz vor dem jeweils ein Leitungsabschluss oder das Ende der Eingangssequenz. Dann liest er die ganze Klasse Datei in einen String und führt eine rekursive Suche nach dem Muster (siehe findMatch ()). Das ist zweifellos die Quelle des Stackoverflow.

Am Ende habe ich es bekommen, nicht zu arbeiten (und gab) Da Maven 2 veröffentlichte den Maven-Check-plugin-2.4 / 5.0 Check ca. 6 Wochen haben wir beschlossen, unsere Werkzeuge zu aktualisieren. Dies kann nicht das Problem lösen Stackoverflow, aber es gibt mir etwas anderes zu arbeiten, bis jemand entscheidet, dass wir auch in diesem verfolgen müssen.

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