【发布时间】:2018-09-15 00:51:17
【问题描述】:
首先,我知道stackoverflow中有大量的正则表达式线程,我检查了一堆,但在这里很难匹配正确的句子。
我目前正在尝试做的是匹配这些字符: - a-z - A-Z - 0-9 - .()~-_[]
基于这个正则表达式,之后要做的就是用空格替换所有不匹配的字符。
我用作示例的文件名是: - 12345677-fieberthermometer-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@#$%"&*()!ßöäüÄÜÖ"'][}{:;,º.jpg
private static final String FOLDER = "/path/to/my/folder";
private static final String URL_VALID_REGEX = "a-zA-Z0-9\\.\\(\\)\\[\\]\\-~_";
public static void main(String[] args) {
File imagesDirPath = new File(FOLDER);
Pattern p = Pattern.compile("[" + URL_VALID_REGEX + "]");
final String[] listImages = imagesDirPath.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
Matcher m = p.matcher(name);
if (!m.matches()){
File renamedFile = new File(FOLDER + File.separator + name);
name = name.replaceAll("[^" + URL_VALID_REGEX + "]", "");
renamedFile.renameTo(new File(FOLDER + File.separator + name));
}
System.out.println(name);
final String extension = FilenameUtils.getExtension(name);
final boolean isAcceptedExtesion = getAcceptedFileFormatList().contains(extension);
final long lastModified = new File(dir, name).lastModified();
return isAcceptedExtesion;
}
});
}
正如您在代码中看到的那样,字符的替换发生在对有效正则表达式的否定时,但我也不确定这是否应该是这样,因为所有匹配项总是错误的。
第一个问题:即使文件名正确,匹配总是错误的,这会导致创建一个新文件并更改最后修改日期,这很重要保持不变
第二个问题:逗号和星号始终保留在文件名中,但这也可能是由于错误的正则表达式
有效名称示例: - 12345677-fieberthermometer-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0_~()][.jpg
我在这里缺少什么我无法找到的东西?
【问题讨论】:
-
我想你错过了
+:Pattern p = Pattern.compile("[" + URL_VALID_REGEX + "]+");。m.matches()需要完整的字符串匹配。 -
确实这是缺少的,我可以看到现在加号后的值是真的。正则表达式让我发疯,因为一个角色可以改变整个结果哈哈。感谢您的提示!
-
再想一想,
*modiifer 在这种情况下更好。好吧,无论如何,请检查最适合您的方法,+或*。 -
使用 + 和 * 有什么区别?如果我记录得好,+ 至少需要 1 个字符串,而 * 可以没有,对吗?
-
当你使用
+时,空字符串将被处理为replaceAll。如果您之前有一个空字符串检查,这可能不是问题。
标签: java regex regex-negation