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

发布于 2024-10-06 12:03:06 字数 1233 浏览 0 评论 0原文

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

  1. 不包含 /.//../
  2. 必须嵌套至少一个子目录深/tmp/media 内的内容
  3. 必须以 .log 结尾

此处< /a> 是我到目前为止所拥有的:

\/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:

  1. do not contain /./ or /../
  2. must be nested at least one subdirectory deep within /tmp/media
  3. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

流年已逝 2024-10-13 12:03:06

您可以尝试以下操作:

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

rubular 链接

You can try this:

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

rubular link

骑趴 2024-10-13 12:03:06

有必要成为正则表达式吗?正如您提供的链接中所建议的,您可以使用 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.

束缚m 2024-10-13 12:03:06

您应该首先真正规范您的路径。这将避免尝试阻止正则表达式本身中的 ... 目录。完成此操作后,正则表达式将变为:

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

在不知道您正在使用哪种语言进行编程的情况下,我无法建议路径规范化机制。

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:

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

Without knowing which language you are programming in, I cannot suggest a path-canonization mechanism.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文