部分路径的正则表达式

Regex for partial path

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

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

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

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

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

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

详情:

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

Online DEMO Regex DEMO

我会推荐这个模式:

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

DEMO

它是这样工作的:

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

使用这些修饰符:

  • g 在输入中搜索多个匹配项
  • m 将每一行视为单独的输入
^(/([^/]+){0,2}\/?)$

分解

  • ^ 是字符串的开始

  • {0,2}表示重复前面的0到2次。

  • 然后使用 ?

    以可选的斜杠结尾
  • 字符串结尾是 $ 所以它不匹配更长的字符串。

  • () 围着整个东西拍下来。

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

您的正则表达式 (\/|.*\/) 使用交替匹配正斜杠或任何字符 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次
  • $ 字符串结束