2017-05-29 3 views
2

ich mit Index: in folgendem FormatRegulärer Ausdruck einen Linie und Extrakt Dateinamen in Java

Index: /aap/guru/asdte/atsAPI.tcl 
=================================================================== 
RCS file: /autons/atsAPI.tcl,v 
retrieving revision 1.41 

Index: /aap/guru/asdte/atsAPI1.tcl 
=================================================================== 
RCS file: /autons/atsAPI1.tcl,v 
retrieving revision 1.41 

Was ich will, ist passend eine Linie starten String muß übereinstimmen und dann die Dateinamen von dem Pfad bekommen.

Ich meine zuerst erhalten Index: /aap/guru/asdte/atsAPI.tcl und extrahieren Sie dann atsAPI.tcl als Endergebnis.

Momentan benutze ich die Übereinstimmung zweimal, erste ganze Zeile und dann Extrahieren des Dateinamens.

Meine Frage ist, wie man es in einem einzigen regulären Ausdruck in Java macht.

aktuellen Code ist

String line = "Index: /aap/guru/asdte/atsAPI.tcl\r\n===================================================================\r\nRCS file: /autons/atsAPI.tcl,v\r\nretrieving revision 1.41\r\n\r\nIndex: /aap/guru/asdte/atsAPI1.tcl\r\n===================================================================\r\nRCS file: /autons/atsAPI1.tcl,v\r\nretrieving revision 1.41"; 
Pattern regex1 = Pattern.compile("Index:.*?\\n", Pattern.DOTALL); 
Pattern regex2 = Pattern.compile("[^*/]+$"); 

Matcher matcher1 = regex1.matcher(line); 
while (matcher1.find()) { 
    String s = matcher1.group(0); 

    Matcher matcher2 = regex2.matcher(s); 
    while (matcher2.find()) { 
     System.out.println(matcher2.group(0)); 
    } 
} 
+0

https://codebunk.com/b/128141613/ –

+0

Sie Sie brauchen keine 'DOTALL'-Flagge, die Sie dazu brachte, Ihrem nicht-gierigen Punkt eine neue Zeile hinzuzufügen. '.' stimmt standardmäßig nicht mit Zeilenvorschüben überein. – revo

+0

@g_p Ich habe in einer Antwort gezeigt, wie man es mit einem Regex zusammen mit einer funktionierenden Demo macht. Ich hoffe es hilft! – degant

Antwort

1

, wie es in einem einzigen regelmäßig zu tun Ausdruck in Java.

Verwenden Sie eine Erfassungsgruppe wie unten gezeigt. Regular Expression:

^Index:.*\/(.*) 

Nun kann der Dateiname unter Verwendung matcher.group(1) erhalten werden und wird durch den letzten Teil (.*) in der Regex

  • ^ Streichhölzer zu entfachen Anker
  • Index: entspricht dem wörtlichen as- vertreten ist
  • .* entspricht alles (gierig)
  • \/ Matches ein Schrägstrich /
  • (.*) entspricht den Dateinamen in einer Erfassungsgruppe

Stellen Sie sicher, (?m) oder Pattern.MULTILINE-Flag gesetzt ist, so dass die Abstimmung mit mehreren Leitungen und entsprechen den Start Anker ^ am Anfang jeder Zeile .

Regex101 Demo

EDIT: Code ändern nur eine Regex zu verwenden, wie folgt aus:

Pattern pattern = Pattern.compile("^Index:.*\\/(.*)", Pattern.MULTILINE); 

Matcher matcher = pattern.matcher(line); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

// Output: 
atsAPI.tcl 
atsAPI1.tcl 

Demo

0

Versuchen Sie, diese ^Index.+\/([^\.]+\.\w+)$ mit den gm Flaggen oder Index.+\/([^\.]+\.\w+) ohne m Flagge. Die einzige Erfassungsgruppe ist der Name der Datei.

0

die folgenden regex Versuchen, ist die Antwort in der ersten Partie Gruppe:

Index:.*?\/([\w]+\.[\w]*) 

Sie können es debuggen in dem folgenden Link: Regex link

Verwandte Themen