【问题标题】:Regex for valid image in URL [duplicate]URL中有效图像的正则表达式[重复]
【发布时间】: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


【解决方案1】:

我在记事本++中复制了它,但我会尝试在java中进行。

问题很少。您应该匹配有问题的字符,如果找到,请替换它们。使用 find() 而不是匹配,因为您不需要匹配整个字符串。

在记事本中,我只需将 [^a-zA-Z0-9.()[]\-~_]+ 替换为 "" 即可得到您想要的。

在java中

import java.util.regex.*;

public class HelloWorld{

public static void main(String[] args) {
     String wrong="12345677-fieberthermometer-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@#$%\"&*()!ßöäüÄÜÖ\"'][}{<>:;,º.jpg";
     String pattern="[^a-zA-Z0-9\\.\\(\\)\\[\\]\\-~_]+";
     Pattern p = Pattern.compile(pattern);
     Matcher m = p.matcher(wrong);
     if (m.find()){
                right = wrong.replaceAll(pattern, "");
                System.out.println(right);
     }
  }
}

【讨论】:

  • 答案不相关。 每个文件都与之匹配,因为每个文件至少有一个匹配字符。 - 错误,[a-z]matches 只匹配只有 1 个字符的字符串。 所以你应该匹配有问题的字符,如果找到替换它们 - OP 正是这样做的,请参阅 name = name.replaceAll("[^" + URL_VALID_REGEX + "]", "");您需要转义“-” - OP 模式包含转义的 -
  • 对不起,也许我解释错了。我现在修复了答案并添加了一个有效的 java 示例
  • 你只是在重新发明 OP 代码。该步骤已经在 OP 代码中起作用。在与replaceAll 一起使用的模式中,您不需要+,尽管它更合乎逻辑。但不是必需的。
  • 这不是必需的,因为它会替换找到的每个字符,但会使正则表达式更具可读性,我相信(但不确定)它会有更好的性能 - 至少在我的脑海中
  • 也许我在重新发明,但我的作品;)而 OP 没有......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
相关资源
最近更新 更多