首页 > 解决方案 > 在以“管道”开头的字符串中查找连续行

问题描述

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

我有一个这样的字符串:

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

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

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

第一组:

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

组2:

|Text6|Text8|Text9\n

换句话说:对于以 a 开头的每一行,|我都需要整行。如果有几行都以 a 开头|,我需要将这些行放在一组中。

按照这里的要求,一些额外的例子:

示例 1

以下输入

Text1|Text2\n

应该不返回匹配项,因为没有以 a 开头的行|

示例 2

以下输入

|Text1|Text2

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

示例 3

以下输入

sometext\n|Text1|Text2\nsometext

应该返回 1 组

|Text1|Text2\n

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

示例 4

以下输入

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

应该返回 2 组

|someothertext\n

|someothertext\n

因为这两行以 a 开头,以 a|结尾\n

示例 5

以下输入

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

应该返回 1 组

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

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

|我发现以下正则表达式匹配以 a 开头和结尾的一行\n

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

但它不识别连续的行。我知道我不知何故需要使用反向引用\1,但我还没有让它工作。

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

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

Markdown 中的表格由以管道开头的几行描述,其中表格的每一列由管道分隔。以管道开头的连续行属于一个表。每个“列”的内容(即一行中两个管道之间的值)可以是任何文本,甚至可以是另一个降价表达式。

此处描述了降价的表语法https://www.tablesgenerator.com/markdown_tables

标签: c#regex

解决方案


看起来您根本不需要 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();

它使用库GroupAdjacent中的方法MoreLinq

对于您的输入输出将是


推荐阅读