2

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

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

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

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

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

4

4 回答 4

4

我会推荐这种模式:

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

DEMO

它是这样工作的:

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

使用这些修饰符:

  • g在输入中搜索多个匹配项
  • m将每一行视为单独的输入
于 2018-10-28T16:30:52.043 回答
2

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

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

交替的任何一种模式都不能再匹配尾随jkl

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

你可以使用:

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

在 Java 中:

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

正则表达式演示

解释

  • ^字符串的开始
  • /匹配正斜杠
  • (?:非捕获组
    • \w+匹配 1+ 个单词字符(如果您想匹配的内容比\w使用字符类的多,并添加您想要匹配的内容)
    • /?匹配可选的正斜杠
  • ){0,2}关闭非捕获组并重复 0 - 2 次
  • $字符串的结尾
于 2018-10-28T16:38:50.170 回答
2

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

细节 :

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

Online DEMO Regex DEMO

于 2018-10-28T16:30:44.973 回答
1
^(/([^/]+){0,2}\/?)$

把它分解

  • ^是字符串的开头

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

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

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

  • ()围绕整个事情来捕捉它。

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

于 2018-10-28T16:34:51.503 回答