正则表达式捕获不包含目录链接的所有文件路径

时间:2010-12-08 15:38:03

标签: regex validation path

我正在尝试编写正则表达式来匹配具有以下特征的文件路径:

  1. 不包含/.//../
  2. 必须嵌套在/tmp/media
  3. 深处的至少一个子目录中
  4. 必须以.log
  5. 结尾

    Here是我到目前为止所做的:

    \/tmp\/media\/(?!.*\.?\.\/)+(?:.*\.log)
    

    这是我想要的结果(如果字符串不匹配,我引用不满足的要求):

    /tmp/media/log.log             //NO-MATCH (2)
    /tmp/media/test/log.log        //MATCH
    /tmp/media/../log.log          //NO-MATCH (1)
    /tmp/media/./log.log           //NO-MATCH (1)
    /tmp/media/test/../log.log     //NO-MATCH (1)
    /tmp/media/../test/log.log     //NO-MATCH (1)
    /tmp/media/.t/log.log          //MATCH
    /tmp/media/.../log.log         //MATCH
    /tmp/log.log                   //NO-MATCH (2)
    /tmp/media/test/log.notlog     //NO-MATCH (3)
    /tmp/media/test/./log.log      //NO-MATCH (1)
    

    我已阅读this question,并成功实现了部分答案,但是当我不想要它时,/ tmp / media / log.log仍然匹配。我怀疑是因为/media/log.log之间的空字符串以某种方式满足(?!.*\.?\.\/)

    任何人都可以解释我做错了什么并帮助我纠正我的表达吗?

3 个答案:

答案 0 :(得分:1)

是否有必要成为正则表达式?如您提供的链接中所示,您可以使用readlink。此外,在为其他约束进行正则表达式匹配之前,检查/.//../会更容易 - 这会使您的代码更清晰。

答案 1 :(得分:1)

你可以试试这个:

^(?![^.]*\/\.\.?\/)\/tmp\/media\/(?:[^\/]+)*\/\w+\.log$

rubular link

答案 2 :(得分:1)

你应该真正首先对你的路径进行封装。这将避免尝试阻止正则表达式本身中的...目录。完成后,正则表达式变为:

\/tmp\/media\/[^\/]+\/.*\.log

在不知道您编程的语言的情况下,我无法建议路径规范化机制。