用于解析重复组的正则表达式

RegEx for parsing repeated groups

源字符串包含如下标签:

>>>tagA
contents 1
<<<tagA
...
>>>tagB
contents 2
<<<tagB
...

我需要提取其中的标签名称和内容。这是我得到的,但仍然无法正常工作:

(?<=(>>>(?<tagName>.+)$))(?<contents2>.*?)(?=(<<<.+)$)

results 到两个匹配项,但第二个匹配项中的 tagName 捕获了多行:

tagA 
contents 1 
<<<tagA

我做错了什么?

在这里,我们可能会从一个简单的表达式开始,它以 >>><<< 为界,可能类似于:

>>>(.+)\s*(.+)\s*<<<.+

我们在这两个捕获组中有我们想要的数据:

(.+)

然后我们将编写其余问题的脚本。

Demo

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @">>>(.+)\s*(.+)\s*<<<.+";
        string input = @">>>tagA
            contents 1
            <<<tagA

            >>>tagB
            contents 2
            <<<tagB

            >>>tagC

            contents 2

<<<tagC
";
        RegexOptions options = RegexOptions.Multiline;
        
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

正则表达式电路

jex.im 可视化正则表达式:

您可以使用

>>>(?<tagName>.+?)[\r\n]+(?s:(?<contents>.*?))<<<

regex demo

详情

  • >>> - >>> 子串
  • (?<tagName>.+?) - 组 "tagName":尽可能少的任何 1+ 个字符
  • [\r\n]+ - 一个或多个 CR 或 LF 符号
  • (?s:(?<contents>.*?)) - 组 "contents":内联修饰符组匹配任何 0+ 个字符,但尽可能少
  • <<< - <<< 子串。

在 C# 中:

var matches = Regex.Matches(s, @">>>(?<tagName>.+?)[\r\n]+(?s:(?<contents>.*?))<<<");

参见 C# demo:

var s = ">>>tagA\ncontents 1\n<<<tagA\n...\n>>>tagB\ncontents 2\n<<<tagB\n...";
var matches = Regex.Matches(s, @">>>(?<tagName>.+?)[\r\n]+(?s:(?<contents>.*?))<<<");
foreach (Match m in matches) {
    Console.WriteLine(m.Groups["tagName"].Value);
    Console.WriteLine(m.Groups["contents"].Value);
}

输出:

tagA
contents 1

tagB
contents 2