部分路径的正则表达式
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次
我会推荐这个模式:
/^(\/[^\/]+){0,2}\/?$/gm
它是这样工作的:
^
搜索行首
(\/[^\/]+)
搜索路径元素
(
开团
\/
搜索斜杠
[^\/]+
搜索一些非斜线字符
{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}$";
说明
^
字符串开头
/
匹配正斜杠
(?:
非捕获组
\w+
匹配 1+ 个单词字符(如果你想匹配超过 \w
你可以使用 character class 并添加你想要匹配的内容)
/?
匹配可选的正斜杠
){0,2}
关闭非捕获组并重复0-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/
到目前为止,我已经尝试了 (\/|.*\/)
但这并没有得到没有“/”结尾的路径。
您需要一个像 ^(\/\w+){0,2}\/?$
这样的模式,它会检查您的 (/
和名称) 不超过 2 次并且它可以结束/
详情:
^
: 字符串的开头(\/\w+)
: 斜杠(转义)和字字符,都在一个组中{0,2}
组可0/1/2次\/?
: 斜线(转义)可以是0次或1次
我会推荐这个模式:
/^(\/[^\/]+){0,2}\/?$/gm
它是这样工作的:
^
搜索行首(\/[^\/]+)
搜索路径元素(
开团\/
搜索斜杠[^\/]+
搜索一些非斜线字符
{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}$";
说明
^
字符串开头/
匹配正斜杠(?:
非捕获组\w+
匹配 1+ 个单词字符(如果你想匹配超过\w
你可以使用 character class 并添加你想要匹配的内容)/?
匹配可选的正斜杠
){0,2}
关闭非捕获组并重复0-2次$
字符串结束