我对正则表达式很陌生,经过搜索并尝试了几个小时才能找到以下问题的解决方案。
我有一个像这样的字符串:
|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中进行了描述。
答案 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
方法
您的输入输出将是