【问题标题】:Java/android - check if string `FileName` contains any file-name-disallowed charactersJava/android - 检查字符串`FileName`是否包含任何文件名不允许的字符
【发布时间】:2014-01-15 02:13:10
【问题描述】:

我正在检查字符串filename 是否可以安全保存,方法是检查它是否有任何带有正则表达式的奇怪字符。这将是一个 .json 文件,并且还应允许文件名中有空格。

public static boolean fileNameIsSafe(String nameIncExt) {
        Matcher m = Pattern.compile("regex?").matcher(nameIncExt);
        return m.matches();
    }

正则表达式是什么?

【问题讨论】:

  • 我们可以看看一些示例数据:正确和不正确的输入吗?您的正则表达式尝试也很好。
  • 请定义“奇怪的字符”。我会用这个词来指代我姐姐的前男友。
  • John Smith.json 之类的。奇怪的字符例如 /][;'etc 不允许在文件名中出现

标签: java android regex filenames


【解决方案1】:

可能有一个更优雅的解决方案 - 我不是正则表达式专家,但如何:

[.]*\w[\w| |.]*

分解:

[.]* 

文件名可以以 0 个或多个 '.'s 开头

\w  

那么你至少需要一个单词字符,可以是 a-z、A-Z、0-9 或 _。这可以防止“...”的文件名或以空格开头的文件名,或仅包含“.”和空格的文件名。

[\w| |.]*

剩余的文件名可以包含 0 个或多个单词字符、空格和/或“.”我假设您可以修剪尾随空格。

注意在 Java 中你需要转义反斜杠,所以它看起来像这样:

boolean isSafeFilename = Pattern.matches("[.]*\\w[\\w| |.]*", stringToTest);

【讨论】:

    【解决方案2】:

    我感觉你从未访问过这个网站:Regular-Expressions

    无论如何,你可以匹配一个字符类中的字符:[/\]\[;']

    【讨论】:

    • 我似乎无法在该网站上找到我要查找的内容,您所说的字符类是什么意思?
    • [this text is inside a character class] 它将匹配以下任何字符,仅匹配一次:acdehilnrstx
    • 那么你将如何使用它从文件名中删除 "/?%*:\"/|!@#$^&{}`~[];,'" 并返回一个'safe' 字符串,或者在 isSafe() 中返回 false。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2013-12-04
    • 2013-10-26
    • 2012-11-15
    • 2013-12-04
    • 2012-01-14
    • 2014-12-27
    相关资源
    最近更新 更多