c# - 在以“管道”开头的字符串中查找连续行
问题描述
我对正则表达式很陌生,并且搜索并尝试了几个小时以找到以下问题的解决方案。
我有一个这样的字符串:
|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。
解决方案
看起来您根本不需要 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
对于您的输入输出将是
推荐阅读
- r - 如何添加到 group_by_at dplyr 函数中的分组
- julia - Julia:管道输入以从字符串处理
- node.js - Opencv4nodejs findNonZero 异常
- sql - 无法使用 SQL Server 中的分区函数获取最大分区数
- gmail-api - 错误 403,元数据范围不允许格式 FULL 。Web 应用程序 Gmail API 通过邮递员获取消息
- javascript - 交叉引用 JSON 和 MySQL?
- netsuite - 需要知道测试netsuite应用程序的常见场景
- javascript - Array.reduce 语句有些复杂?
- c# - 性能的反射替代方案
- list - 使用:在列表理解中