2014-03-07 64 views
0
String s = "Remediation Release 16 - Test Status Report_04032014.xlsx"; 

s.matches("([^\\s]+(\\.(?i)(xlsx))$)"); // returns false 

我試過http://regex101.com/ exmaple和它說匹配是真實的。Java 1.7字符串類匹配方法返回假時,它應該是真

有比賽方法,我失蹤

+0

可能重複[string.matches(正則表達式)返回false,但我認爲它應該是真實的(http://stackoverflow.com/questions/14613621/string-matchesregex-returns-false-although-我認爲它應該是真的) – devnull

+0

請注意渲染在\的帖子其實是代碼中的\\ – user1035795

回答

1

在java matches()確實執行整個字符串的匹配。所以你必須在求正則表達式時使用.*

s.matches(".*([^\\s]+(\\.(?i)(xlsx))$)"); 
      ^^ here 
0

你錯過了整個文本的開始和文件擴展名之間的細微差別一些。

嘗試:

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參數中使用外部圓括號。

相關問題