正则表达式表示部分路径

时间:2018-10-28 16:25:03

标签: java regex parsing re2 sumologic

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

我会推荐这种模式:

[user]
      name = username
      email = username@domaim.com

DEMO

它是这样的:

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

使用这些修饰符:

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

答案 1 :(得分:2)

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

要分解

  • ^是字符串的开头

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

  • 然后使用?

  • 以可选的斜杠结束
  • 字符串结尾为$,因此与更长的字符串不匹配。

  • ()围绕整个事物来捕获它。

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

答案 2 :(得分:1)

您需要类似^(\/\w+){0,2}\/?$的模式,它会检查您是否拥有/和名称)不超过2次,并且可以以{{1}结尾}

详细信息:

  • /:字符串的开头
  • ^:斜线(转义)和文字字符,全部成组
  • (\/\w+)该组可以是0/1/2倍
  • {0,2}:斜杠(转义)可以是0或1次

Online DEMO Regex DEMO

答案 3 :(得分:1)

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