正则表达式替换Windows在文件名中不接受的字符

Kdg*_*Dev 34 java regex

我正在尝试构建一个正则表达式,它将检测Windows不接受的任何字符作为文件名的一部分(这些对于其他操作系统是否相同?我不知道,说实话).

这些符号是:

 \ / : * ? "  | 

无论如何,这就是我所拥有的: [\\/:*?\"<>|]

来自http://gskinner.com/RegExr/的测试人员表明这是有效的.对于字符串Allo*ha,*符号亮起,表示已找到它.Allo**ha但是,我应该进入,只有第一个*会亮起来.所以我想我需要修改这个正则表达式以找到所提到的字符的所有外观,但我不确定.

你看,在Java中,我很幸运能够拥有String.replaceAll函数(String regex,String replacement).描述说:

将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换.

换句话说,即使正则表达式只找到第一个然后停止搜索,这个函数仍然会找到它们.

例如: String.replaceAll("[\\/:*?\"<>|]","")

但是,我不觉得我可以冒这个险.那么有谁知道如何扩展它?

Ale*_*x_M 18

因为没有答案足够好我自己做了.希望这可以帮助 ;)

public static boolean validateFileName(String fileName) {
    return fileName.matches("^[^.\\\\/:*?\"<>|]?[^\\\\/:*?\"<>|]*") 
    && getValidFileName(fileName).length()>0;
}

public static String getValidFileName(String fileName) {
    String newFileName = fileName.replace("^\\.+", "").replaceAll("[\\\\/:*?\"<>|]", "");
    if(newFileName.length()==0)
        throw new IllegalStateException(
                "File Name " + fileName + " results in a empty fileName!");
    return newFileName;
}
Run Code Online (Sandbox Code Playgroud)

  • 这不会删除所有无效字符.例如,你遗漏了特殊字符. (4认同)
  • 除了在文件名的开头,^不会阻止这个匹配的特殊字符吗?我使用了fileName.replace("^ \\.+","").replaceAll("[\\\\ /:*?\"<> |]","") (2认同)

bob*_*nce 16

Windows文件名规则很棘手.你只是在摸索表面.

例如,除了列出的字符之外,这里还有一些无效的文件名:

                                    (yes, that's an empty string)
.
.a
a.
 a                                  (that's a leading space)
a                                   (or a trailing space)
com
prn.txt
[anything over 240 characters]
[any control characters]
[any non-ASCII chracters that don't fit in the system codepage,
 if the filesystem is FAT32]
Run Code Online (Sandbox Code Playgroud)

删除像String.replaceAll()这样的单个正则表达式子句中的特殊字符是不够的; 你可以很容易地得到一些无效的东西,如空字符串或尾随'.' 要么 ' '.用"_"替换"[^ A-Za-z0-9 _.]*"之类的东西将是更好的第一步.但是,您仍然需要在您使用的任何平台上进行更高级别的处理.


Ada*_*11p 5

我使用纯粹和简单的正则表达式。我给出了可能出现的字符,并通过否定“^”我改变了所有其他字符作为此类的标志。“_”

String fileName = someString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");

例如:如果您不想在表达式中出现一个“.”。在然后删除“\\。”

String fileName = someString.replaceAll("[^a-zA-Z0-9\\-]", "_");