C# 另一个多行组Regex查询

C# 另一个多行组Regex查询,c#,.net,regex,C#,.net,Regex,所以我试图编写一个正则表达式来过滤文本文件中的特定片段(寻找速度而不是暴力) 我想从每场比赛中得到三样东西: 用于标识代码段的键 一种可选的语言,用于格式化每个代码段 值,表示开始标记和结束标记之间的所有行 这是正则表达式(此处可以找到失败的测试线束-): (?s)代码开始(?[A-Za-z-]*)(?[A-Za-z]*).[\n](?*?)[\n].*结束代码(?[A-Za-z-]*) 使用以下选项:RegexOptions.Compiled | RegexOptions.Explicit

所以我试图编写一个正则表达式来过滤文本文件中的特定片段(寻找速度而不是暴力)

我想从每场比赛中得到三样东西:

  • 用于标识代码段的
  • 一种可选的语言,用于格式化每个代码段
  • ,表示开始标记和结束标记之间的所有行
这是正则表达式(此处可以找到失败的测试线束-):

(?s)代码开始(?[A-Za-z-]*)(?[A-Za-z]*).[\n](?*?)[\n].*结束代码(?[A-Za-z-]*)

使用以下选项:
RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.Multiline

这样的文件:

// code start foo csharp
var x = 1;
// end code foo 
为我提供了期望值:

  • :foo
  • 语言:csharp
  • 变量x=1
但当我引入第二行的代码片段时,我只得到最后一行:

// code start foo csharp
var x = 1;
var y = 2;
// end code foo 
  • :foo
  • 语言:csharp
  • 变量y=2
而不是

  • 变量x=1\r\nvar y=2(或类似)
让团队覆盖多条线路,我错过了什么


我已经查看了SO上提出的类似场景,但它们对我的使用不起作用。

这可以通过更改两个
*
的贪婪度来解决:

(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*?[\n](?<value>.*)[\n].*?end code (?<key>[A-Za-z-]*)
(?s)代码开始(?[A-Za-z-]*)(?[A-Za-z]*)。?[\n](?*)[\n].*结束代码(?[A-Za-z-]*)

阅读该语言后的
*
必须不那么贪婪,因为我们需要第一行新行后面的内容作为代码段值。但是,用于解析
值的
*
可能更贪婪,因为它不应该在遇到第一个
\n
时停止,因此出现了上述模式。

如果您愿意,还可以使用一些环视工具来捕获

(?<=code\sstart\s)(?<key>\b\w+\b)\s(?<language>\b\w+\b).*\r\n(?<content>(?s).*)(?=\r\n.*end\scode\s\1\s-->)
(?)

将单线改为多线以“.”匹配“\n”?我想解析几乎任何类型的文本文件,而不仅仅是XML。我可以用C#或ruby或任何有评论的语言来做这个示例…谢谢!正是我需要的!我手头有一个更能容忍空白的版本,但我也希望支持任何文本文件有注释的内容。因此,在这种情况下,查找XML打开/关闭注释标记对我没有帮助。如果需要,可以随时跳过打开/关闭标记:)虽然您希望它严格:P