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

时间:2015-05-15 05:42:46

标签: 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=video
Case4: group1=wp

我创建的模式与前两种情况相匹配,但忽略了最后两种情况:

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

1 个答案:

答案 0 :(得分:1)

使用纯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;group2=video;group3=video123(请参阅demo)。

如果您需要正则表达式解决方案,nhahtdh已经为您提供了使用可选非捕获组的示例正则表达式,但我还建议在模式的末尾使用.*消耗所有字符,或者我们是将与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));
}

正则表达式解释:

  • ([^/]+) - 除/
  • 以外的第一组1个或多个字符
  • (?:/([^/]+)(?:/([^/]+)?)?)? - 匹配的可选捕获组
    • / - 文字/
    • ([^/]+) - 除/
    • 以外的第二组1个或多个字符
    • (?:/([^/]+)?)? - 与上述内容相同的可选捕获组
  • .* - 将所有字符匹配,但将换行符添加到字符串的末尾,以便我们不会进一步匹配。 删除如果您想进一步匹配。或者替换为(?=\\s|$)前瞻以匹配字符串的空格或结尾之前。

查看另一个演示here