捕获多行字符组

时间:2018-02-20 16:37:30

标签: java regex multiline

Regex专业人士,我有一个GoogleTest --gtest_list_tests输出,我需要解析它以获得每个测试套件和案例。输出具有以下格式:

TestSuite1.  
    TestCase1  
    TestCase2  
TestSuite2.  
    TestCase1  
    TestCase2  
    TestCase3  

等等。我需要一个java正则表达式模式,它将捕获每个测试套件及其案例。对于上面的输入,我需要将组1作为

TestSuite1.  
    TestCase1  
    TestCase2  

和第2组为

TestSuite2.  
    TestCase1
    TestCase2  
    TestCase3  

我似乎无法弄清楚如何让它发挥作用。现在我正在使用这种模式:

(.+\\.\\n(?:\\s+.+\\n)+)+ 

哪个不起作用。感谢

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式捕获分组数据:

[^.\s]+\.(?:\R\h+.+)+

RegEx Demo

<强>解释

  • [^.\s]+:匹配任何不是点而不是空格的字符
  • \.:后跟一个点
  • (?:\R\h+.+)+匹配1行或多行以1+空格开头的测试用例

答案 1 :(得分:1)

也许您可以将\n设为可选,并省略最后一个量词+

(.+\.\n(?:\s+.+\n?)+)

那就匹配

(       # Capturing group
  .+    # Any character one more times
  \.    # Match a dot
  \n    # Match a newline
  (?:   # Non capturing group
    \s+ # One or more whitespace characters
    .+  # Any character one more times
    \n? # An optional newline
  )+    # Close non capturing group and repeat o 1 or more times
)       # Close capturing group

如果您不想在第1组中捕获它,可以使用:

.+\.\n(?:\s+.+\n?)+

答案 2 :(得分:1)

如果设置多行标记,则可以使用行终止符$

public static void main(String[] args)
    throws IOException
{
    String s = "TestSuite1.\n" + 
               "    TestCase1\n" + 
               "    TestCase2\n" + 
               "TestSuite2.\n" + 
               "    TestCase1\n" + 
               "    TestCase2\n" + 
               "    TestCase3";

    Matcher matcher = Pattern.compile("\\w+\\.$(\\s+\\w+$)+", Pattern.MULTILINE).matcher(s);

    while (matcher.find())
    {
        System.out.println(matcher.group());
        System.out.println("-----------");
    }
}

Output:

TestSuite1.
    TestCase1
    TestCase2
-----------
TestSuite2.
    TestCase1
    TestCase2
    TestCase3
-----------