2016-06-24 17 views
5

Ich versuche, einen einfachen regulären Ausdruck zu schreiben, um alle Dateinamen in einer Liste zu identifizieren, die mit der Erweiterung ".req.copied" enden. Der Code I bin mit untenRegulärer Ausdruck für Dateierweiterungen in Java

public class Regextest { 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
String test1=new String("abcd.req.copied"); 
    if(test1.matches("(req.copied)?")) { 
    System.out.println("Matches"); 
    } 
    else 
    System.out.println("Does not Match"); 
    } 

} 

Die Regex Tests ok in Online-Regex Tester aber funktioniert nicht im Programm. Ich habe mehrere Kombinationen ausprobiert (wie split req und kopierte in zwei regexes, oder Literalabgleich des Punktzeichens), aber nichts funktioniert (sogar die einfachste Regex von (reg)? Gab eine Ausgabe "Nicht stimmt" zurück). Bitte lassen Sie mich wissen, wie ich das angehen kann.

+10

Warum nicht einfach 'string.endsWith ("req.copied.") Verwendet werden soll; '? – resueman

+0

Einige Dateien im Verzeichnis haben eine benutzerdefinierte Erweiterung wie ".err" nach ".req.copied" (d. H. ".req.copied.err"). Aber du hast Schluss damit, die Hälfte des Problems zu lösen. Danke Resueman. – MohanVS

+1

Sie könnten 'contains()' – sinclair

Antwort

5

Hauptproblem mit matches hier ist, dass es von Regex erfordert gesamte Zeichenfolge. Aber in Ihrem Fall beschreibt Ihre Regex nur Teil davon.

Wenn Sie wirklich matches hier Ihren Code könnte verwenden möchten aussehen wie

test1.matches(".*\\.req\\.copied") 
  • . steht für ein beliebiges Zeichen (außer Zeilenseparatoren wie \r) so, wenn Sie es nur darstellen wollen dot Sie müssen Escape wie \. (in Zeichenfolge müssen wir es als "\\." schreiben, weil \ hat auch spezielle Bedeutung dort - wie Erstellen von Sonderzeichen \r\n und so weiter).
  • .* lassen regex alle Zeichen annehmen .req.copied

Aber in Ihrem Fall, dass Sie einfach endsWith Methode

test1.endsWith(".req.copied") 
+0

Danke Pshemo! Ich benutzte einen einzelnen Schrägstrich vor dem Punkt, um den Buchstaben zu bezeichnen, das war mein Fehler. – MohanVS

2

Wie reseman sagte in den Kommentaren, brauchen Sie keine Regex dafür. Sie können einfach überprüfen, ob jeder Dateiname endsWith(".req.copied").

if(test1.endsWith(".req.copied")){ 
    System.out.println("Matches"); 
}else{ 
    System.out.println("Does not match"); 
} 

By the way, kann die obige if-else mit System.out.println(test1.endsWith(".req.copied") ? "Matches" : "Does not match"); ersetzt werden.

+0

Danke dorukayhan! – MohanVS

1

test1.matches(".*\\.req\\.copied") sollte es tun, aber in Ihrem Fall sollten Sie endsWith() anstelle von verwenden.

+1

Achten Sie darauf, '.' wie' \\. 'Zu entfernen. – oldrinb

+0

Danke Sinclair! Danke oldrinb! – MohanVS

1

Sie sollten mit einem Regex kommen, die das gesamte String-Format, nicht einen Ausschnitt passen würde:

String test1= "abcd.req.copied"; 

if(test1.matches("^.*req\\.copied$")) { 
    System.out.println("Matches"); 
} else { 
    System.out.println("Does not Match"); 
} 

Auch Ihr Format wurde mit (req.copied)?, die jeden Fall würde passen. Auch . Symbol entspricht einem beliebigen Zeichen, also entkomme es, um einen Punkt zu finden.

+0

Danke Agner! – MohanVS