源字符串包含如下标记:
>>>tagA
contents 1
<<<tagA
...
>>>tagB
contents 2
<<<tagB
...
我需要提取标签名称和标签内容。这是我所拥有的但仍然无法正常工作:
(?<=(>>>(?<tagName>.+)$))(?<contents2>.*?)(?=(<<<.+)$)
results进行两次匹配,但是第二次匹配中的tagName捕获了多行:
tagA
contents 1
<<<tagA
我在做什么错了?
答案 0 :(得分:1)
在这里,我们可能会以一个以>>>
和<<<
为界的简单表达式开始,也许类似于:
>>>(.+)\s*(.+)\s*<<<.+
我们在两个捕获组中拥有所需的数据:
(.+)
,我们将编写剩下的问题脚本。
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可视化正则表达式:
答案 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