Java reg表达式捕获字符串

时间:2017-08-29 09:15:47

标签: java regex

我有以下字符串:

"(1)name1:content1(2)name2:content2(3)name3:content3...(n)namen:contentn"

我想要做的是捕获name_icontent_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(),什么都不会被退回。

3 个答案:

答案 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位数字且)
      • [^(]* - 除(
      • 以外的0个字符

请参阅regex demo

enter image description here

答案 2 :(得分:-1)

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

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