的 java 中用到文件操作时,经常要验证文件名是否合法.
我以前都是用 File
类的 createNewFile()
方法.当然,这个方法的确很管用.但当要批量验证时,总不能一个个创建文件吧.
于是想到了正则, 正则匹配的开销比创建文件小了不知道多少倍.
Google了一下Win平台的文件名规则,并实践了一下.
那么一个合法的文件(Win下)应该符合如下规则 .
- 文件名不能为空,空在这里有两个意思
- 文件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等不可见的转义字符)
- 文件名和扩展名不能同时为空.但实际上我们可以用程序创建出类似.project,..txt等形式的文件,但却创建不出类似abc.的文件
- 文件名中不能包含\/:*?”<>|中的任意字符
- 文件名(包括扩展名)的长度不得大于255个字符
事实上形如”..”(不包含引号,下同)的文件也不能被创建.
不合法的文件还有类似” aa”, “aa “, “aa.”(会被创建为”aa”,也把它算作不合法),”a\ta”(\t为制表符等不可见字符(除空格外))
于是我们得到了文件名命名规则的更详细规定:
- 首尾不能有空字符(空格、制表符、换页符等空白字符的其中任意一个),文件名尾不能为.号
- 文件名和扩展名不能同时为空
- 文件名中不能包含\/:*?”<>|中的任意字符
- 文件名(包括扩展名)的长度不得大于255个字符
- 在1.的条件下,文件名中不能出出现除空格符外的任意空字符.出现控制字符其实也算不合法,但因为情况太复杂,就不做判断了。
于是有如下匹配
首字符: [^\s\\/:\*\?\"<>\|]
尾字符: [^\s\\/:\*\?\"<>\|\.]
其它字符: (\x20|[^\s\\/:\*\?\"<>\|])*
\s 只能匹配下面六种字符(via: java.util.regex.Pattern
):
半角空格( )
水平制表符(\t)
竖直制表符
回车(\r)
换行(\n)
换页符(\f)
用Java语言实现:
public static boolean isValidFileName(String fileName) { if (fileName == null || fileName.length() > 255) return false; else return fileName.matches( "[^\\s\\\\/:\\*\\?\\\"<>\\|](\\x20|[^\\s\\\\/:\\*\\?\\\"<>\\|])*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$"); }
用于测试:
System.out.println("null(未初始化)" + "\t" + isValidFileName(null)); System.out.println(" .xml" + "\t" + isValidFileName(" .xml")); System.out.println(".xml " + "\t" + isValidFileName(".xml ")); System.out.println(" .xml " + "\t" + isValidFileName(" .xml ")); System.out.println(".xml." + "\t" + isValidFileName(".xml.")); System.out.println(".xml" + "\t" + isValidFileName(".xml")); System.out.println(" .xml(制表符)" + "\t" + isValidFileName(" .xml")); System.out.println(".." + "\t" + isValidFileName("..")); System.out.println("fdsa fdsa(制表符)" + "\t" + isValidFileName("fdsa fdsa(制表符)")); System.out.println("a.txt" + "\t" + isValidFileName("a.txt"));
结果:
null(未初始化) false .xml false .xml false .xml false .xml. false .xml true .xml(制表符) false .. false fdsa fdsa(制表符) true a.txt true
相关推荐
6. **验证**:在修改文件名后,再次检查是否符合所有目标系统的规范,确保可操作性。 在实际应用中,例如在压缩包中处理文件名时,我们需要先解压文件,然后对每个子文件的文件名进行检查和处理,最后再重新打包。...
例如,美国电话号码的格式可能是`(XXX) XXX-XXXX`,我们可以用以下正则表达式进行验证: ```java String phoneRegex = "^\\(\\d{3}\\) \\d{3}-\\d{4}$"; ``` 这个表达式匹配以括号包围的3位区号,空格,3位本地...
日期格式在数据处理中极为常见,正则表达式可以用来验证日期的有效性,例如判断日期是否符合标准格式,或者检查日期是否合法(比如不存在的日期)。下面列举了多种日期格式的正则表达式。 ##### 1. YYYY-MM-DD 格式...
以下是一些常用的正则表达式,用于不同场景下的数字验证: 1. **整数验证**: - `"^[0-9]*$"`:匹配任意数量的数字(包括空字符串)。 - `"^\d{n}$"`:精确匹配`n`位长度的数字串。 - `"^\d{n,}$"`:匹配至少`n`...
- 文件名的验证:可以使用`^[a-zA-Z0-9._-]+$`来验证文件名是否合法,其中`^`表示开始,`$`表示结束,`[a-zA-Z0-9._-]`表示允许的字符集合。 - 邮箱格式校验:`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`...
11. **正则验证日期格式**:例如`/^\d{4}-\d{2}-\d{2}$/`可以验证形如`YYYY-MM-DD`的日期格式。 12. **邮箱验证**:正则`/^[\w\.-]+@[\w-]+(\.[\w-]+)+$/`可以检查电子邮件地址的合法性。 13. **匹配源代码中的...
正则表达式校验工具是帮助程序员和非程序员测试和调试正则表达式的实用工具,它能够快速验证一个正则表达式是否能正确匹配目标字符串。 正则表达式的基本概念: 1. 字符集:包括普通字符(如a-z、A-Z、0-9)和特殊...
3. `MTracer.lic`:这可能是一个许可证文件,用于验证软件的授权状态,确保用户可以合法使用该工具。 4. `MTracerWeb.ocx`:这可能是一个ActiveX控件,用于在Web环境中集成正则表达式调试功能,例如在网页上进行...
- 验证身份证号码是否合法。 6. **验证一年的12个月**:“`^(0?[1-9]|1[0-2])$`” - 确保月份格式正确。 7. **验证一个月的31天**:“`^((0?[1-9])|((1|2)[0-9])|30|31)$`” - 确保日期格式正确。 #### 七、网页...
2. **字符串处理**:通过正则表达式来匹配和验证文件名。 3. **条件判断**:决定哪些文件需要被检查,哪些不需要。 4. **错误记录**:将不符合规范的文件名记录到日志文件中。 5. **用户输入处理**:允许用户自定义...
根据给定文件的信息,我们可以提炼出一系列与C#正则表达式相关的知识点,这些知识点涵盖了数字、字符、字符串长度、邮箱、网址、电话号码、身份证号等多方面的验证模式,以及一些特定场景下的数据清洗方法。...
- **Part2**: 身份证号码验证函数`verify`,首先检查长度是否合法(15或18位),然后检查前17位是否符合规定的数字范围,接着对18位身份证号码进行校验码验证,最后通过生日字段检查出生日期的有效性。 - **Part3**...
1. **检查字符串开头是否包含盘符**:Windows路径通常以盘符(如A:、B:、C:等)开头,可以使用正则表达式来检查这一点。例如,`^[A-Za-z]:`匹配一个字母后跟冒号的模式。 2. **验证路径中的目录分隔符**:Windows...
\ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,...
js_is_valid_filename验证文件名的函数主要目的是帮助开发者确保所使用的文件名符合特定的标准和要求,特别是当涉及到文件上传、文件系统操作以及需要确保文件名的兼容性时。该函数不仅需要考虑文件命名的规则,还...
- 用于验证输入的月份是否合法。 8. **匹配日期(1-31日):** `^((0?[1-9])|((1|2)[0-9])|30|31)$` - 验证日期范围是否在1到31天之间。 #### 四、正则表达式的实际应用案例 1. **限制输入为中文:** ```...
- **表单验证**:在Web开发中,经常需要验证用户输入的数据是否符合预期格式,例如验证电子邮件地址是否合法。正则表达式可以用来快速检查用户输入是否符合规定的格式。 - **文本替换**:在修改代码时,有时需要批量...