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

时间:2019-06-02 18:13:37

标签: c# .net regex regex-lookarounds regex-group

源字符串包含如下标记:

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

我需要提取标签名称和标签内容。这是我所拥有的但仍然无法正常工作:

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

results进行两次匹配,但是第二次匹配中的tagName捕获了多行:

tagA 
contents 1 
<<<tagA

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

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

>>>(.+)\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);
        }
    }
}

RegEx电路

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

enter image description here

答案 1 :(得分:1)

您可以使用

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

请参见regex demo

详细信息

  • >>>-一个>>>子字符串
  • (?<tagName>.+?)-组“ tagName”:尽可能少1个字符
  • [\r\n]+-一个或多个CR或LF符号
  • (?s:(?<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