Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 - Fatal编程技术网

Java 正则表达式中的选项模式分隔符

Java 正则表达式中的选项模式分隔符,java,regex,Java,Regex,我想创建一个与给定字符串匹配的模式,并从该字符串创建几个组 输入字符串: Case 1: wp/video/video123/xyz/abc Case 2: wp/video/video123 Case 3: wp/video Case 4: wp 以及所需的输出: Case1: group1=wp,group2=video,group3=video123 Case2: group1=wp,group2=video,group3=video123 Case3: group1=wp,group2

我想创建一个与给定字符串匹配的模式,并从该字符串创建几个组

输入字符串:

Case 1: wp/video/video123/xyz/abc
Case 2: wp/video/video123
Case 3: wp/video
Case 4: wp
以及所需的输出:

Case1: group1=wp,group2=video,group3=video123
Case2: group1=wp,group2=video,group3=video123
Case3: group1=wp,group2=video
Case4: group1=wp
我创建的模式与前两种情况匹配,但忽略了后两种情况:

(.*?)/+(.*?)/(.*?)[/.]

使用纯
String.Split
然后访问组,您可以在没有正则表达式的情况下执行任何操作:

String input ="wp/video/video123/xyz/abc";
String[] spts = input.split("/");
System.out.println("group1=" + spts[0] + ";group2=" + spts[1] + ";group3=" + spts[2]);
这将输出
group1=wp;组2=视频;group3=video123
(请参阅)

如果您需要正则表达式解决方案,NHAHDH已经为您提供了一个使用可选非捕获组的示例正则表达式,但我还建议使用模式末尾带有
*
的所有字符,或者我们将获得与
xyz/abc
的进一步匹配:

String str = "wp/video/video123/xyz/abc";
String rx = "([^/]+)(?:/([^/]+)(?:/([^/]+)?)?)?.*";
Pattern ptrn = Pattern.compile(rx);
Matcher m = ptrn.matcher(str);
while (m.find()) {
    System.out.println("group1=" + m.group(1) + ",group2=" + m.group(2) + ",group3=" + m.group(3));
}
正则表达式解释:

  • ([^/]+)
    -除
    /
  • (?:/([^/]+)(?:/([^/]+)?)?
    -匹配的可选捕获组
    • /
      -文字
      /
    • ([^/]+)
      -除
      /
    • (?:/([^/]+)?)?
      -与上述相同内容匹配的可选捕获组
  • *
    -将除换行符以外的所有字符匹配到字符串末尾,这样我们就不会得到进一步的匹配。如果要获得更多匹配项,请将其删除。或者替换为一个
    (?=\\s |$)
    在空格或字符串结尾之前先行匹配

请参阅另一个演示

类似的内容
([^/]+)(?:/([^/]+)(?:/([^/]+))?)?
谢谢35; NHAHDH。它起作用了。你能给我解释一下你的答案吗?这样我以后可以根据我的要求修改它。你的要求不清楚,所以我在评论中说了些废话。如何使用这个正则表达式(
Matcher.find
)?您考虑过
String.split