【问题标题】:Regex for partial path部分路径的正则表达式
【发布时间】:2018-10-28 16:25:02
【问题描述】:

我有这样的路径(单行):

/
/abc
/def/
/ghi/jkl
/mno/pqr/
/stu/vwx/yz
/abc/def/ghi/jkl

我只需要匹配第三个“/”的模式。换句话说,仅包含“/”和前 2 个目录的路径。但是,我的一些目录以“/”结尾,而有些则没有。所以我想要的结果是:

/
/abc
/def/
/ghi/jkl
/mno/pqr/
/stu/vwx/
/abc/def/

到目前为止,我已经尝试过(\/|.*\/),但这并没有得到没有“/”结尾的路径。

【问题讨论】:

    标签: java regex parsing re2 sumologic


    【解决方案1】:

    我会推荐这种模式:

    /^(\/[^\/]+){0,2}\/?$/gm
    

    DEMO

    它是这样工作的:

    • ^ 搜索行首
    • (\/[^\/]+) 搜索路径元素
      • (开群
      • \/ 搜索斜线
      • [^\/]+ 搜索一些非斜线字符
    • {0,2} 说,应该找到这些路径元素中的 0 到 2 个
    • \/? 允许尾部斜杠
    • $ 搜索行尾

    使用这些修饰符:

    • g 在输入中搜索多个匹配项
    • m 将每一行视为单独的输入

    【讨论】:

      【解决方案2】:

      你需要一个像^(\/\w+){0,2}\/?$ 这样的模式,它会检查你有/和名字)不超过2次并且它可以以/结尾

      详情:

      • ^ : 字符串开头
      • (\/\w+) :斜线(转义)和字字符,都在一个组中
      • {0,2}组可以0/1/2倍
      • \/? : 斜线(转义)可以是 0 次或 1 次

      Online DEMO Regex DEMO

      【讨论】:

        【解决方案3】:

        您的正则表达式 (\/|.*\/) 使用了一个替换,它匹配正斜杠或任何字符 0+ 次贪婪,然后匹配正斜杠。

        例如在/ghi/jkl 中,第一个匹配项将是第一个正斜杠。然后下一个模式的这部分.* 将从第一个g 匹配到字符串的末尾。引擎将回溯到最后一个正斜杠以填充整个.*\/ 模式。

        结尾的jkl 不能再被交替模式匹配。

        请注意,您不必转义正斜杠。

        你可以使用:

        ^/(?:\w+/?){0,2}$

        在 Java 中:

        String regex = "^/(?:\\w+/?){0,2}$";
        

        Regex demo

        说明

        • ^ 字符串开头
        • /匹配正斜杠
        • (?:非捕获组
          • \w+ 匹配 1+ 个单词字符(如果您想匹配多个 \w,您可以使用 character class 并添加您想要匹配的内容)
          • /? 匹配可选正斜杠
        • ){0,2}关闭非捕获组并重复0-2次
        • $字符串结束

        【讨论】:

          【解决方案4】:
          ^(/([^/]+){0,2}\/?)$
          

          分解

          • ^ 是字符串的开头

          • {0,2} 表示重复前一个 0 到 2 次。

          • 然后它以可选的斜杠结束,使用 ?

          • 字符串结尾是$,所以它不匹配更长的字符串。

          • ()围绕整个东西来捕捉它。

          但我要指出,目录匹配几乎总是错误的答案。一些目录具有特殊含义,例如 /../.. 实际上会向上两个目录,而不是向下。最好使用系统目录 API 来获得更可靠的结果。

          【讨论】:

          • 请注意,您不必转义正斜杠。您的正则表达式使用 3 个捕获组,其中缺少外部组的右括号。您可以省略 2 个外部捕获组,并使内部一个非捕获组。这种模式[^/]+ 也将match 换行符和$ 在您的解释中所指的位置丢失。
          • 语法错误。括号不匹配。请修复。
          • 如果你在我写这篇文章 3 年后才读到这篇文章,那么你应该特别注意我说不要这样做的部分。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-28
          • 1970-01-01
          • 1970-01-01
          • 2013-02-12
          • 2023-02-08
          • 1970-01-01
          • 2020-09-30
          相关资源
          最近更新 更多