我想创建一个与给定字符串匹配的模式,并从该字符串创建多个组。
输入字符串:
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
我创建的模式与前两种情况相匹配,但忽略了最后两种情况:
(.*?)/+(.*?)/(.*?)[/.]
答案 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));
}
正则表达式解释:
([^/]+)
- 除/
(?:/([^/]+)(?:/([^/]+)?)?)?
- 匹配的可选捕获组
/
- 文字/
([^/]+)
- 除/
(?:/([^/]+)?)?
- 与上述内容相同的可选捕获组.*
- 将所有字符匹配,但将换行符添加到字符串的末尾,以便我们不会进一步匹配。 删除如果您想进一步匹配。或者替换为(?=\\s|$)
前瞻以匹配字符串的空格或结尾之前。查看另一个演示here