Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 部分路径的正则表达式_Java_Regex_Parsing_Re2_Sumologic - Fatal编程技术网

Java 部分路径的正则表达式

Java 部分路径的正则表达式,java,regex,parsing,re2,sumologic,Java,Regex,Parsing,Re2,Sumologic,我有这样的路径(单线): 我只需要与第三个“/”匹配的模式。换句话说,路径只包含“/”和最多前2个目录。然而,我的一些目录以“/”结尾,而有些则没有。所以我想要的结果是: / /abc /def/ /ghi/jkl /mno/pqr/ /stu/vwx/ /abc/def/ 到目前为止,我已经尝试了(\/\124;。*\/),但这并不能使路径以“/”结尾。您需要一个类似^(\/\w+){0,2}/?$的模式,它检查(/和名称)的次数不超过2次,并且可以以/结尾 详情: ^:字符串的开头 (\

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

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

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

到目前为止,我已经尝试了
(\/\124;。*\/)
,但这并不能使路径以“/”结尾。

您需要一个类似
^(\/\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次之间重复前面的步骤

  • 然后使用

  • 字符串结尾是
    $
    ,因此它不匹配较长的字符串

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

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

您的正则表达式
(\/\124;。*\/)
使用一个交替选项,该选项匹配正斜杠或任何字符0+倍,然后匹配正斜杠

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

尾随的
jkl
不能再被交替的两种模式匹配


请注意,您不必逃避正斜杠

您可以使用:

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

在Java中:

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

解释

  • ^
    字符串的开头
  • /
    匹配正斜杠
  • (?:
    非捕获组
    • \w+
      匹配1个以上的单词字符(如果您想匹配多于
      \w
      的字符,可以使用a并添加您想要匹配的字符)
    • /?
      匹配可选正斜杠
  • ){0,2}
    关闭非捕获组并重复0-2次
  • $
    字符串的结尾

请注意,您不必转义正斜杠。您的正则表达式使用3个捕获组,其中,is忽略了外部组的右括号。您可以省略2个外部捕获组,而将内部捕获组设为非捕获组。此模式
[^/]+
也将是一个换行字符,
$
在您的说明中所指的位置缺失。
^((\/([^/]+){0,2}\/?)
String regex = "^/(?:\\w+/?){0,2}$";