我有以下字符串:
"(1)name1:content1(2)name2:content2(3)name3:content3...(n)namen:contentn"
我想要做的是捕获name_i
和content_i
中的每一个,我该怎么做?我应该提到name_i
未知。例如,name1
可以是"abc"
,name2
可以是"xyz"
。
我尝试过:
String regex = "\\(\\d\\)(.*):(.*)(?=\\(\\d\\))";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println(matcher.group(0);
System.out.println(matcher.group(1);
System.out.println(matcher.group(2);
}
但结果并不是很好。我也试过matcher.mathes()
,什么都不会被退回。
答案 0 :(得分:1)
如果您的姓名和内容不包含任何非“字”边界字符,则此方法有效:
public static void test(String input){
String regexpp = "\\(\\d+\\)(\\w+):(\\w+)";
Pattern p = Pattern.compile(regexpp);
Matcher m = p.matcher(input);
while(m.find()){
System.out.println("Name: " + m.group(1));
System.out.println("Content: " + m.group(2));
}
}
输出:
Name: name1
Content: content1
Name: name2
Content: content2
Name: name3
Content: content3
Name: name99
Content: content99
答案 1 :(得分:1)
您可以使用
String s = "(1)name1:content1(2)name2:content2(3)name3:content3...(4)namen:content4";
Pattern pattern = Pattern.compile("\\(\\d+\\)([^:]+):([^(]*(?:\\((?!\\d+\\))[^(]*)*)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
请参阅Java demo
<强>详情
\\(\\d+\\)
- 匹配(x)
子字符串x
为1位或更多位([^:]+)
- 第1组::
:
- 冒号([^(]*(?:\\((?!\\d+\\))[^(]*)*)
- 第2组:
[^(]*
- 除(
(?:\\((?!\\d+\\))[^(]*)*
- 零个或多个序列:
\\((?!\\d+\\))
- (
未跟随1位数字且)
[^(]*
- 除(
请参阅regex demo。
答案 2 :(得分:-1)
您的表达式贪婪地匹配 - 您的第一个组首先吃掉冒号,因此无法匹配整个表达式。您可以使用非贪婪匹配(使用*?
中的问号)来使您的模式匹配。
String regex = "\\(\\d\\)(.*?):(.*?)(?=\\(\\d\\))";