正则表达式捕获不包含目录链接的所有文件路径
我正在尝试编写一个正则表达式来匹配具有以下特征的文件路径:
- 不包含
/./
或/../
- 必须嵌套至少一个子目录深
/tmp/media
内的内容 - 必须以
.log
结尾
\/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)
我已阅读 这个问题,并成功实现了一些答案,但 /tmp/media/log.log 是当我不希望它匹配时仍然匹配。我怀疑这是因为 /media/
和 log.log
之间的空字符串以某种方式满足 (?!.*\.?\.\/).
谁能解释我做错了什么并帮助我纠正我的表达?
I am trying to write a regular expression to match file paths with the following characteristics:
- do not contain
/./
or/../
- must be nested at least one subdirectory deep within
/tmp/media
- must end in
.log
Here is what I have so far:
\/tmp\/media\/(?!.*\.?\.\/)+(?:.*\.log)
Here are my desired results (if the string doesn't match, I cite the requirement which is not satisfied):
/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)
I have read this question, and successfully implemented some of the answer, but /tmp/media/log.log is still matching when I do not want it to. I suspect it is because the empty string between /media/
and log.log
somehow satisfies (?!.*\.?\.\/)
.
Can anyone explain what I'm doing wrong and help me correct my expression?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以尝试以下操作:
rubular 链接
You can try this:
rubular link
有必要成为正则表达式吗?正如您提供的链接中所建议的,您可以使用 readlink。另外,在对其他约束进行正则表达式匹配之前检查
/./
和/../
会更容易 - 会让你的代码更干净。Is it necessary to be a regexp? As suggested in the link you provided, you can use readlink. Also, it would be easier to just check for
/./
and/../
before doing the regex matching for other constraints - would make your code cleaner.您应该首先真正规范您的路径。这将避免尝试阻止正则表达式本身中的
.
和..
目录。完成此操作后,正则表达式将变为:在不知道您正在使用哪种语言进行编程的情况下,我无法建议路径规范化机制。
You should really canonize your paths first. This will avoid attempting to block
.
and..
directories in the regex itself. Once you have done that, the regex becomes:Without knowing which language you are programming in, I cannot suggest a path-canonization mechanism.