Java字符串操作

昨天写代码,遇到一个看似无聊的问题。

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. 思考可能的方法

  • 直接人工匹配:通过String的各种API来解决
  • 总结规律及模式:使用正则表达式进行匹配,更直观地把需求显示出来
  • 可以考虑系统或别人提供的API

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效果还不错。


 

你可能感兴趣的:(java)