我正在尝试构建一个正则表达式,它将检测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)
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 _.]*"之类的东西将是更好的第一步.但是,您仍然需要在您使用的任何平台上进行更高级别的处理.
我使用纯粹和简单的正则表达式。我给出了可能出现的字符,并通过否定“^”我改变了所有其他字符作为此类的标志。“_”
String fileName = someString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
例如:如果您不想在表达式中出现一个“.”。在然后删除“\\。”
String fileName = someString.replaceAll("[^a-zA-Z0-9\\-]", "_");
| 归档时间: |
|
| 查看次数: |
36669 次 |
| 最近记录: |