String s = "Remediation Release 16 - Test Status Report_04032014.xlsx";
s.matches("([^\\s]+(\\.(?i)(xlsx))$)"); // returns false
我尝试了http://regex101.com/的例子,它说匹配是真的。
我缺少匹配方法的细微差别
答案 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
参数中不需要外括号。