你錯過了整個文本的開始和文件擴展名之間的細微差別一些。
嘗試:
String s = "Remediation Release 16 - Test Status Report_04032014.xlsx";
// | "Remediation" ... to ... "Report_04032014"
// | is matched by ".+"
System.out.println(s.matches("([^\\s]+.+(\\.(?i)(xlsx))$)"));
輸出
true
由於matches
整個文本匹配:
[^\\s]
將匹配您輸入的開始。
.+
將匹配文件名
(\\.(?i)(xlsx))$)
將匹配點+擴展,不區分大小寫,接着輸入的端
爲了證明這一點:
// | removed outer group
// | | added group 1 here for testing purposes
// | | | this is now group 2
// | | | | removed outer group
Pattern p = Pattern.compile("[^\\s]+(.+)(\\.(?i)(xlsx))$");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println("Group 1: " + m.group(1) + " | group 2: " + m.group(2));
}
輸出
Group 1: Release 16 - Test Status Report_04032014 | group 2: .xlsx
也如所證明的,您不需要在最初的matches
參數中使用外部圓括號。
可能重複[string.matches(正則表達式)返回false,但我認爲它應該是真實的(http://stackoverflow.com/questions/14613621/string-matchesregex-returns-false-although-我認爲它應該是真的) – devnull
請注意渲染在\的帖子其實是代碼中的\\ – user1035795