昨天写代码,遇到一个看似无聊的问题。
0. 问题
检查linux文件名是否符合规范,正确的文件名,例如
~/myfile ./myfile ../../myfile
不合规范的文件名,比如
/home//myfile /home/./myfile /home/../myfile /home/~/myfile
问题看上去很简单,为其写一个检查的函数就可以解决,函数里主要是进行一些字符串的操作。
1. 初次尝试
写了一个版本,发现其实可以通过正则表达式匹配来识别无效的串。
于是找了一些文档(Java Regex Tutorial),参考着写出了第一个版本。
boolean isInvalidPath(String path) { return path.matches(".*(\\./|\\.\\./|~/).*") && !path.matches("^(\\./|\\../|~/).*"); }
2. 思考可能的方法
3. 单元测试
public void testIsInvalidPath() throws Exception { assertTrue(isInvalidPath("/sandbox//app/imported.txt")); assertTrue(isInvalidPath("/sandbox/./app/imported.txt")); assertTrue(isInvalidPath("/sandbox/../app/imported.txt")); assertTrue(isInvalidPath("/sandbox/~/app/imported.txt")); assertFalse(isInvalidPath("../imported-space().txt")); assertFalse(isInvalidPath("/sandbox/123.txt")); assertFalse(isInvalidPath("123.txt")); assertFalse(isInvalidPath("1abc.txt")); assertFalse(isInvalidPath("12 3.txt")); assertFalse(isInvalidPath("\"12 3.txt\"")); assertFalse(isInvalidPath("`~!@#$%^&*()_+-={}[]|\"':;<,>.?")); }
由于思考不周全, 这里的方法漏掉了几种情况,比如
./home/./myfile
就不能识别成错误的文件路径。
4. 小结
将遇到的问题放到更大的范围去考虑,会有不同以往的思路。
正则表达式学习起来要花些力气,但是用途比较广,比如做字符串匹配,执行*nix命令,进行代码/文字处理等。
写好单元测试很重要,用来学习API效果还不错。