我以前没有参加过常规赛,这是练习和学习的好榜样。有一段文字:
№ Вопрос Ответ
1 Дата звонка 08.08.2014
2 Время звонка 16:30
3 Имя оператора Иванов Иван
4 Номер телефона абонента 84957777777
5 Кто звонит
6 Номер карты
7 Препарат
8 Телефон
9 Комментарий тест звонок
可以说,它有3 列——数字、特征和值,它们由制表符分隔,但前面也可能没有 3 列,分别是制表符。我们需要一个正则表达式来提取所有这些列的值。
有这样一个选项:
var TdPattern = new Regex(
@"^ \s* (\d+) \s* \t ([^\t]+) \t \s* ([^\t]*) \s* $",
RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);
它可以工作,但如果在 2 个“列”之后没有选项卡,则会产生不正确的结果。
逐行读取文件并使用通常
string.Split()的 ,例如:然后下载将如下所示:
如果数据不在文件中,而是在字符串变量中,则先用换行符分割:
选择适当的换行符,也许它对你来说就足够了,
'\n'或者'\r'如果可能遇到空行,您可以使用该选项跳过它们
StringSplitOptions.RemoveEmptyEntries安德烈的答案是应该在现实生活中使用的解决方案,当可以访问代码时,以“纯程序化”的方式解决问题。
用于在多行文本中查找行的正则表达式(带有换行符)必须用“anchors”(锚点)
^(行首/LF 之后的位置,\n)和$(行尾/LF 之前的位置,\n) 带有修饰符RegexOptions.Multiline. 列之间的空格可以用\p{Zs}*,\p{Zs}- 除制表符之外的任何水平空格。如果您使用\s,那么您可能会无意中捕获下一行的一部分。\t找到一个制表符,并在一行上找到一列的值 - 使用[^\r\n\t]+/[^\r\n\t]*,即 CR(ASCII 代码 13)、LF(ASCII 代码 10)和 TAB(ASCII 代码 9)以外的 1+/0+ 个字符。To 在多行模式下(使用RegexOptions.Multiline)绑定$发现以 CRLF 结尾的行尾必须加\r?在$.?要声明一个可选的、可选的字符序列,您需要使用带有:量词的子模式(非或捕获,取决于我们是否希望稍后获取所有捕获的子字符串)(?:...)?。那些。当一行可能有也可能没有一列时,它可以声明为(?:\p{Zs}*\t\p{Zs}*[^\r\n\t]+)?. 由于它是?“贪婪的”,引擎将至少尝试在子模式中查找模式序列一次。如果没有找到,它将检查此可选组(如果有)之后的模板。表达式如下所示:
为了不混淆正则表达式的结构,您可以声明两个变量(分隔符和列模式)并在构建表达式时使用它们。
在线查看演示:
结果:
如果列确实是制表符分隔而不是空格分隔,那么以下正则表达式将有所帮助:
^(\d+)\t(.*?)(?:\t(.*))?$如果列由多个空格分隔,那么您可以尝试以下操作:
^(\d+)\s\s+(.*?)(?:\s[^\S\n]+(.*))?$