在以“ pipe”开头的字符串中找到有意义的行

时间:2019-03-14 20:11:43

标签: c# regex

我对正则表达式很陌生,经过搜索并尝试了几个小时才能找到以下问题的解决方案。

我有一个像这样的字符串:

|Text1|Text2|Text3\n|Text4|Text5|Text6\nSomething else\n|Text6|Text8|Text9\n

文本有几行(行表示换行符),其中一些以|开头(可能包括其他管道)。

我需要C#的RegEx的正则表达式,该正则表达式提供以下组:

Group1:

|Text1|Text2|Text3\n|Text4|Text5|Text6\n

Group2:

|Text6|Text8|Text9\n

换句话说:对于以|开头的每一行,我都需要整行。如果有几行连续的行都以|开头,那么我需要将这些行组合在一起。

根据此处的要求提供一些其他示例:

示例1

以下输入

Text1|Text2\n

应该不返回任何匹配项,因为没有一行以|开头

示例2

以下输入

|Text1|Text2

应该不返回任何匹配项,因为没有以\n结尾的行

示例3

以下输入

sometext\n|Text1|Text2\nsometext

应返回1组

|Text1|Text2\n

因为该行以|开头并以\n结束

示例4

以下输入

sometext\n|someothertext\nsometext\n|someothertext\n

应返回2组

|someothertext\n

|someothertext\n

因为这两行以|开头并以\n结束

示例5

以下输入

sometext\n|someothertext\n|sometext\n|someothertext\n

应返回1组

|someothertext\n|sometext\n|someothertext\n

因为三行都以|开头并以\n结尾,所以它们是连续的。

我发现以下正则表达式匹配从|开始并以\n结尾的一行:

(?s)(\\n\|)((.*?)\\n)

,但无法识别连续的行。我知道我需要某种方式使用后向引用\1,但是我还没有使它生效。

要澄清:我的实际任务是增强 WPF库https://github.com/theunrepentantgeek/Markdown.XAML的以下Markdown,以便它支持表语法。

由于WPF库的减价是基于IEnumerable管道中使用的RegEx表达式集,因此我想保持这种模式,只添加表所需的部分。

markdown中的表由以管道开头的几行描述,其中表的每一列都由管道分隔。从管道开始的连续行属于一个表。每个“列”的内容(一行中两个管道之间的值)可以是任何文本,甚至可以是另一个markdown-expression。

标记降价的表语法在https://www.tablesgenerator.com/markdown_tables中进行了描述。

1 个答案:

答案 0 :(得分:0)

看起来您根本不需要RegEx。只需用“ \ n”分隔输入,然后以聪明的方式对行进行分组。尝试以下代码:

var input = "|Text1|Text2|Text3\n|Text4|Text5|Text6\nSomething else\n|Text6|Text8|Text9\n";

var lines = input.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)
    .GroupAdjacent(line => line.StartsWith("|"))
    .Where(x => x.Key) // select only lines that starts with pipe
    .Select(g => string.Join("\n", g))
    .ToArray();

它使用MoreLinq库中的GroupAdjacent方法

您的输入输出将是