Java reg表达式捕获字符串

Java reg表达式捕获字符串,java,regex,Java,Regex,我有以下字符串: "(1)name1:content1(2)name2:content2(3)name3:content3...(n)namen:contentn" 我想做的是捕获每个名称\u I和内容\u I,我该怎么做?我应该提到,name\u I是未知的。例如,name1可以是“abc”,name2可以是“xyz” 我所尝试的: String regex = "\\(\\d\\)(.*):(.*)(?=\\(\\d\\))"; Pattern pattern = Pattern.comp

我有以下字符串:

"(1)name1:content1(2)name2:content2(3)name3:content3...(n)namen:contentn"
我想做的是捕获每个
名称\u I
内容\u I
,我该怎么做?我应该提到,
name\u 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()
,什么也不会返回。

您的表达式非常匹配-您的第一组先吃掉冒号,因此无法匹配整个表达式。您可以使用非贪婪匹配(使用问号,如
*?
)使模式匹配

String regex = "\\(\\d\\)(.*?):(.*?)(?=\\(\\d\\))";

如果您的姓名和内容不包含任何非“单词”边界字符,则此操作有效:

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
你可以用

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)); 
} 

详细信息

  • \\(\\d+\\)
    -匹配
    (x)
    子字符串,其中
    x
    是一个或多个数字
  • ([^::]+)
    -第1组:一个或多个字符,而不是
  • -冒号
  • ([^(]*(?:\\(?!\\d+\\)[^(]*)*)
    -第二组:
    • [^(]*
      -除
    • (?:\\((?!\\d+\\)[^(]*)*
      -零个或多个以下序列:
      • \\((?!\\d+\\)
        -a
        后面不跟1+数字和
      • [^(]*
        -0+字符,而不是


您可以使用我建议的可读性较差但更宽松有效的正则表达式:
“\\(\\d+\\)([^:]+):([^(]*(?:\\(?!\\d+\\)[^(]*)”
谢谢您的建议。它比我的效果更好。但仍然只有第一组,即
name1
content1
,在
matcher.group()中返回
。谢谢您的回复。但是
名称\u i
未知。例如
name1
可以是
“abc”
name2
可以是
“xyz”
。您可以在问题中说明确切的字符串。最好提供一个更具代表性的示例,以免混淆其他示例。
不需要在正则表达式中转义