Wie kann man in RegexpHeader von checkstyle eine optionale Regex-Gruppe mit einem Newline-Zeichen angeben?

9

Ich habe Probleme, eine Regex-Gruppe ( ()? ) anzugeben, die ein Newline-Zeichen ( \n ) im RegexpHeader -Modul von maven-checkstyle-plugin , z. B.

, enthält %Vor%

wo as value="a(\nc)?b" mit Fehler Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:2.17:check (check_style) on project document-scanner: Failed during checkstyle configuration: cannot initialize module RegexpHeader - Cannot set property 'header' to 'a(\nc)?b' in module RegexpHeader: InvocationTargetException: line 1 in header specification is not a regular expression -> [Help 1] fehlschlägt.

Laut den RegexpHeader-Dokumenten

  

Einzelne Kopfzeilen müssen durch die Zeichenfolge "\ n"

getrennt sein

Dies erklärt, dass die Regex einen Fehler verursacht, verhindert jedoch die Angabe regulärer Ausdrücke mit optionalen Gruppen, die ein Zeilenumbruchzeichen enthalten. Beispiele für diesen Fall sind ebenfalls nicht angegeben.

Lösungen, die nicht funktionieren:

  • Ersetzen von \n durch \n und \\n funktioniert nicht (verursacht denselben Fehler wie oben).
  • value="/*a(\x10c)?b*/\n" stimmt mit einer Datei überein, die mit

    beginnt %Vor%

    aber nicht

    %Vor%
  • Hinzufügen von einfachen Zeilenumbrüchen in der checkstyle XML-Datei
  • Hinzufügen von 
 oder \x0A für Zeilenvorschubzeichen

value="/\*a
cb\*/\n" stimmt mit

überein %Vor%

Es scheint also, dass die Regex-Steuerzeichen ( ()? ) Probleme verursachen.

Ich verwende die maven-checkstyle-plugin 2.17 und Java 7.

Ich habe Ссылка erstellt, um die Untersuchung zu erleichtern.

    
Karl Richter 21.10.2015, 18:31
quelle

2 Antworten

1

Probieren Sie einen mehrzeiligen Modus aus, bei dem ^ und $ Anfang / Ende von jeder Zeile entsprechen:

%Vor%

Sie müssen vielleicht ein bisschen damit experimentieren, wie man den Backslash programmiert.

    
Bohemian 21.10.2015 20:01
quelle
0

Ich habe Probleme mit der Verwendung von Regexen festgestellt. Ich denke, ich habe auch eine Lösung gefunden (aber ich kann es nicht testen, weil ich Maven / Checkstyle nicht verwende).

Ihre Hypothese, dass ()? das Problem ist, ist falsch. Beim Scrollen auf der Seite für RegexpHeader gibt es ein Beispiel, das eine Regex-Gruppe wie ()? :

verwendet %Vor%

Es gibt ein Problem mit Ihrer Regex hier: value="/*a(\x10c)?b*/\n" . Du entkommst den Regex-Kontrollzeichen nicht (aber nicht denen, auf die du hingewiesen hast). Du solltest es machen:

%Vor%

In Java ist es notwendig, die "bösen" geflüchteten entkommen ( \ ). Die Regex in ihrer reinen Form ist:

%Vor%

Sie können die "reine Form" verwenden, wenn sich die Regex in einer eigenen Datei befindet.

Der Volltext aus der Dokumentation besagt (Hervorhebung von mir):

  

Der erforderliche Header wird inline angegeben. Einzelne Kopfzeilen müssen durch die Zeichenfolge "\ n" getrennt sein (selbst auf Plattformen mit einem anderen Zeilentrennzeichen), und reguläre Ausdrücke müssen nicht mehrere Zeilen umfassen .

Dies kann bedeuten, dass Sie jede Zeile mit dem Anker ^ voranstellen müssen. Alle Beispiele, die ich gesehen habe, waren so.

Sie werden sich vielleicht wundern, wie Sie Regexes mit Javadocs (zum Beispiel) verwenden können, die ungefähr dem folgenden Format entsprechen:

%Vor%

Die mittlere Zeile fehlt möglicherweise. Oder es kann 500 Zeilen wie diese geben.

Sie geben ein Beispiel für einen Header, der sich damit beschäftigt.

Regex-Datei (Auszug):

%Vor%

Hinweis: Die Wörter line ## befinden sich wahrscheinlich nicht in der Datei.

RegexpHeader:

%Vor%

Sehen Sie, wie sie Zeile 13 als "mehrzeilig" haben? Aus dem Dokument:

  

Zeilennummern zur Wiederholung (null oder mehr)

    
Laurel 28.04.2016 18:57
quelle

Tags und Links