2016-06-24 99 views
5

我想寫一個簡單的正則表達式來標識以「.req.copied」擴展名結尾的列表中的所有文件名。我正在使用的代碼如下在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"); 
    } 

} 

在線正則表達式測試正常,但在程序中不起作用。我嘗試了多種組合方式(例如分割req並複製到兩個正則表達式中,或者與點字符的文字匹配),但沒有任何作用(即使是最簡單的(reg)正則表達式也返回「不匹配」輸出)。請讓我知道如何解決這個問題。

+10

爲什麼不'string.endsWith( 「req.copied。」); '? – resueman

+0

目錄中的某些文件在「.req.copied」(即「.req.copied.err」)之後具有類似「.err」的自定義擴展名。但是,結局確實解決了一半的問題。謝謝resueman。 – MohanVS

+1

你可以使用'contains()' – sinclair

回答

5

matches這裏的主要問題是它需要從正則表達式匹配整個字符串。但在你的情況下,你的正則表達式只描述了它的部分

如果你真的想在這裏使用matches你的代碼可能看起來更像

test1.matches(".*\\.req\\.copied") 
  • .代表任意字符(除行分隔符像\r),所以如果你想讓它僅僅代表點需要像\.(在字符串中,我們需要將它寫爲"\\.",因爲\在那裏也有特殊的含義 - 例如創建特殊字符\r\n\t等)。
  • .*會讓正則表達式.req.copied

之前接受任何字符,但在你的情況,你只需要使用endsWith方法

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

謝謝Pshemo!我在點之前使用了一個斜槓來表示文字字符,這是我的錯誤。 – MohanVS

2

正如resueman在評論中所說,你不需要一個正則表達式。你可以簡單地檢查每個文件名是否爲endsWith(".req.copied")

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

順便說一句,上面的if-else可以用System.out.println(test1.endsWith(".req.copied") ? "Matches" : "Does not match");代替。

+0

謝謝dorukayhan! – MohanVS

1

test1.matches(".*\\.req\\.copied")應該這樣做,但在你的情況下,你應該考慮使用endsWith()而不是matches

+1

確保像'\\ .'那樣逃脫''。' – oldrinb

+0

謝謝辛克萊!感謝oldrinb! – MohanVS

1

你應該拿出一個正則表達式將匹配整個字符串格式,而不是一個片段:

String test1= "abcd.req.copied"; 

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

而且,您的格式使用(req.copied)?,這將匹配任何情況。此外,.符號可以匹配任何字符,因此請將其轉義爲匹配點。

+0

謝謝你Agner! – MohanVS