用于解析重复组的正则表达式
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>.*?))<<<
详情
>>>
- >>>
子串
(?<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
源字符串包含如下标签:
>>>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>.*?))<<<
详情
>>>
->>>
子串(?<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