Java 1.7 String类匹配方法应该为true时返回false

时间:2014-03-07 12:58:44

标签: java regex string

String s = "Remediation Release 16  - Test Status Report_04032014.xlsx";

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

我尝试了http://regex101.com/的例子,它说匹配是真的。

我缺少匹配方法的细微差别

2 个答案:

答案 0 :(得分:2)

在java matches()中,确实对整个字符串执行匹配。所以你必须在你的正则表达式的乞讨时使用.*

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

答案 1 :(得分: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参数中不需要外括号。