我有这样的路径(单行):
/
/abc
/def/
/ghi/jkl
/mno/pqr/
/stu/vwx/yz
/abc/def/ghi/jkl
我只需要匹配第三个“ /”的模式。换句话说,路径仅包含“ /”并且最多包含前两个目录。但是,我的某些目录以“ /”结尾,有些则没有。所以我想要的结果是:
/
/abc
/def/
/ghi/jkl
/mno/pqr/
/stu/vwx/
/abc/def/
到目前为止,我已经尝试过(\/|.*\/)
,但这没有得到没有“ /”结尾的路径。
答案 0 :(得分:2)
我会推荐这种模式:
[user]
name = username
email = username@domaim.com
它是这样的:
/^(\/[^\/]+){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次答案 3 :(得分:1)
您的正则表达式(\/|.*\/)
使用的替代匹配正斜杠或贪婪0倍以上的任意字符,然后匹配正斜杠。
因此在例如/ghi/jkl
中,第一个匹配项将是第一个正斜杠。然后,下一个模式的这一部分.*
将与第一个g
匹配,直到字符串结尾。引擎将回退到最后一个正斜杠,以完全填充整个.*\/
模式。
结尾的jkl
都无法通过两种交替模式进行匹配。
请注意,您不必转义正斜杠。
您可以使用:
^/(?:\w+/?){0,2}$
在Java中:
String regex = "^/(?:\\w+/?){0,2}$";
说明
^
字符串的开头/
匹配正斜杠(?:
非捕获组
\w+
匹配1个以上的字符(如果您想匹配多个\w
,则可以使用character class并添加要匹配的内容)/?
匹配可选的正斜杠){0,2}
关闭非捕获组并重复0-2次$
字符串的结尾