C# 正则表达式-同一模式的多个出现之间的文本

C# 正则表达式-同一模式的多个出现之间的文本,c#,regex,C#,Regex,我需要解析大量文件,并基于某些令牌处理一些内容。为了做到这一点,我必须获取每个标记及其后面的文本,直到下一个标记(带有额外的新行) 我一直在使用,并弥补它分裂他们 (?<token>^([a-zA-Z].--.*))|(?<content>.*) (?^([a-zA-Z].-.*)|(?.*)) 然而,我无法在一个小组中获得第二场比赛。 期望的结果是获得以下标记和文本对 这是否可以使用单个正则表达式来实现?怎么做 谢谢以下是我为使您的正则表达式正常工作所做的工作 /(

我需要解析大量文件,并基于某些令牌处理一些内容。为了做到这一点,我必须获取每个标记及其后面的文本,直到下一个标记(带有额外的新行)

我一直在使用,并弥补它分裂他们

(?<token>^([a-zA-Z].--.*))|(?<content>.*)
(?^([a-zA-Z].-.*)|(?.*))
然而,我无法在一个小组中获得第二场比赛。 期望的结果是获得以下标记和文本对

这是否可以使用单个正则表达式来实现?怎么做


谢谢

以下是我为使您的正则表达式正常工作所做的工作

/(?<token>[A-Za-z]+)\s*---\s*(?<content>.+?)(?=[A-Za-z]+\s*---\s*|$)/gs
/(?[A-Za-z]+)\s*-\s*(?。+)(?=[A-Za-z]+\s*-\s*.$)/gs

我所拥有的和您所拥有的之间的区别在于,有一个前瞻性检查,用于检查新令牌或数据的结尾


我启用了g(全局)和s(点等于新行)标志。

让我们假设您的
令牌模式是正确的,并且与您需要的所有模式匹配。然后,内容是
令牌
模式之后的所有内容,直到令牌模式的第一次出现,即
^[a-zA-Z]。*
:行的开始(
^
),ASCII字母(
[a-zA-Z]
),除了换行以外的任何字符(
),两个连字符(
-
),然后是尽可能多的任何0个字符,直到行尾(注意,在.NET正则表达式中,
也与CR
“\r”
符号匹配)

如果您的文件没有那么大,您可以使用

@"(?m)^(?<token>[a-zA-Z].--.*)(?<content>(?:\r?\n(?![a-zA-Z].---).*)*)"
输出:

--- New match ---
Token: A ---
Content: some text of many lines
--- New match ---
Token: B ---
Content: other text with some lines
and text and
text
--- New match ---
Token: C ---
Content: more text and tokens and text
--- New match ---
Token: QQ---
Content: more text more text
--- New match ---
Token: HH---
Content: 
--- New match ---
Token: JJ---
Content: 

看,这个版本工作得更好,它采用了整个代币的路线。而且它更高效、更精确。但你选择了另一个答案,这是真的。检查多个文件时,我注意到了这一点。你的工作更快,更正确(但请张贴它作为答案,这样我可以使它的正确答案)。不幸的是,我正在处理的文件乱七八糟,正如你所指出的,确实存在一些案例。同样的情况下,token后面跟token,第一个没有内容。只是在23k文件上测试了它,效果很好(3-4s)。解释得也很好。谢谢
var s = "A ---\r\nsome text of many lines\r\nB ---\r\n\r\nother text with some lines\r\nand text and\r\ntext \r\n\r\nC --- \r\nmore text and tokens and text\r\n\r\nQQ--- \r\n\r\nmore text more text\r\n\r\nHH---\r\nJJ---\r\n";
var pat = @"^(?<token>[a-zA-Z].--.*)(?<content>(?:\r?\n(?![a-zA-Z].---).*)*)";
var result = Regex.Matches(s, pat, RegexOptions.Multiline)
        .Cast<Match>()
        .Select(m => new[] {m.Groups["token"].Value.Trim(), m.Groups["content"].Value.Trim()});
foreach (var pair in result)
    Console.WriteLine($"--- New match ---\nToken: {pair[0]}\nContent: {pair[1]}"); 
--- New match ---
Token: A ---
Content: some text of many lines
--- New match ---
Token: B ---
Content: other text with some lines
and text and
text
--- New match ---
Token: C ---
Content: more text and tokens and text
--- New match ---
Token: QQ---
Content: more text more text
--- New match ---
Token: HH---
Content: 
--- New match ---
Token: JJ---
Content: