【问题标题】:Regex to tell if a string contains a linux file path or if a linux file path as part of a string正则表达式来判断字符串是否包含 linux 文件路径或 linux 文件路径是否作为字符串的一部分
【发布时间】:2019-08-30 12:49:37
【问题描述】:

我正在编写一个正则表达式,用于查看字符串是否包含作为整个字符串的 linux 系统的文件路径或仅作为字符串的一部分的 linux 系统的文件路径。所以基本上当文件路径是整个字符串时我想要匹配,但是当文件路径只是字符串的一部分时我不想要匹配。例如,我希望以下字符串告诉我有匹配项

/home/user/Documents/foo.log

这个字符串不匹配

/home/user/Documents/foo.log was written

以及这个字符串不匹配

the file /home/user/Documents/foo.log was written

到目前为止,我唯一能想到的就是这个,

^(\/*)

这只是说好的,你有一个斜杠后跟一个字符,但我不确定还有什么可以让正则表达式按照我的意愿工作。有人对如何扩展我的正则表达式以使其匹配我想要做的事情有任何意见吗?

编辑

作为命名约定的一部分,空格不是允许的文件名的一部分。是的,用户可以放置一个空格,因为它是一个 linux 系统,但是那将是一个用户错误。

【问题讨论】:

  • 任何字符串都是潜在有效的 Linux 文件路径。你到底想检查什么?
  • /home/user/Documents/foo.log was written 是一个有效的 linux 路径名。
  • 它不是字符串的一部分。因为程序将要么转换发送给程序的日志消息,要么从文件中读取以传输日志消息。所以我想要一种方法来破译它希望我读取文件并且文件名不是日志消息的一部分
  • @n.m.抱歉看了上面的评论
  • 这很奇怪,因为 linux 有效路径是你想象的任何字符串,除了\0 之外的所有可能的字符。像[^\0]* 这样的东西会起作用。如果您不想在文件名中允许空格,那没关系,但是 linux 确实接受带有空格、控制字符等的文件名。文件名的唯一无效字符是 NUL 字符(用于字符串终止)即使您尝试将/ 的序列一起禁止(如//file//a//b) linux 确实接受它们,将/ 组压缩为一个斜杠字符。这样文件路径也有效。

标签: regex linux string


【解决方案1】:

完整 Linux 文件系统路径的正则表达式可以是:

^(/[^/ ]*)+/?$

RegEx Demo

【讨论】:

  • 刚刚补充说,作为命名约定的一部分,文件不应在名称中添加空格。
  • 不。允许使用斜线字符(即使在组中)和空格、控件等。唯一不允许的字符是\0。所以有效的正则表达式是[^\0]*
  • @anubhava,控制字符呢?那么 utf-8 序列呢?假设有人想调用他的文件****attention_file****.txt(星号会被承认吗?反斜杠?问号?)命名约定就是这样,而不是强制执行。如果您的用户以点开头的文件名,则约定表明它不会被 ls(1) 列出(但您也会在 readdir(2) 系统调用中看到它)如果约定说不接受空格,那么正确的正则表达式将是 `[^ \0]*
  • @anubhava,你为什么在你的正则表达式演示中接受多行。你在你的文件名中接受(你接受)\n(Linux 接受它们)???但是您的示例演示中只有 一个匹配项,因为您有两行匹配 仅作为一个文件名。这是另一个约定吗?
【解决方案2】:

文件路径中唯一不允许使用的 linux(和 unix)字符是 ascii nul 字符 \0(不允许使用,因为它用作字符串终止符 --- 在这种情况下是路径名终止符 ---在 open(2) 系统调用中,所以你可以总是只有一个,最后,不算作文件字符)。旧版本不允许将多个 / 斜杠字符组合在一起,因此正确的正则表达式将是 (\/?[^\0/])+|\/(可选斜杠字符后跟非 nul 和非斜杠字符的序列,或者单独的 / 条目 - - 表示根目录)允许除 ascii nul 之外的所有字符,并且不允许两个斜杠同时出现。最近的实现允许对斜杠进行分组(将它们合并为一个),因此有效的路径正则表达式将是 [^\0]+

但这匹配您公开的所有输入(甚至,它会将所有输入匹配为一个文件路径,因为\n 字符被允许作为文件名的一部分),因此您必须更精确你的问题暴露你想要什么和你不想接受什么。 "foo.log was written""the file "(带有最后一个空格)是 linux(和 unix)中的有效文件名。其他控制字符呢?转义序列、通配符(如*?)等呢?

【讨论】:

  • 谢谢你的反对票,谁可以这样做,没有任何解释......某种过于建设性的帮助人们的方式。
  • +1 了。反对者可能是那些在编写软件时做出可怕的、毫无根据的假设的人,这让我们其他人的生活变得困难。
【解决方案3】:

(/)+[a-zA-Z0-9\\-_/ ]*(.log)

(/)+[a-zA-Z0-9\\-_/ ]*(.cpp) 用于匹配字符串中的 c++ 文件路径。 它可能会有所帮助

【讨论】:

    【解决方案4】:

    对于绝对文件路径:

    ^(\/[\w^ ]+)+\/?([\w.])+[^.]$
    

    对于绝对文件夹路径:

    ^(\/[\w^ ]+)+\/?$
    

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 2018-05-23
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多