另一个MultiLine Group正则表达式查询

时间:2013-03-25 10:31:14

标签: c# .net regex

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

我想从每场比赛中得到三件事:

  • 以识别代码段
  • 可选的语言,用于格式化每个代码段
  • ,表示开始和结束标记之间的所有行

这是正则表达式(可在此处找到失败的测试工具 - https://gist.github.com/shiftkey/5236161):

(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*[\n](?<value>.*?)[\n].*end code (?<key>[A-Za-z-]*)

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

这样的文件:

// code start foo csharp
var x = 1;
// end code foo 

给我预期的价值:

  • :foo
  • 语言:csharp
  • var x = 1;

但是当我引入第二行的片段时,我只得到最后一行:

// code start foo csharp
var x = 1;
var y = 2;
// end code foo 
  • :foo
  • 语言:csharp
  • var y = 2;

而不是

  • var x = 1;\r\nvar y = 2;(或类似)

让小组覆盖多条线路时我错过了什么?

我已经看过在SO上提出的类似场景,但它们并没有用于我的使用。

2 个答案:

答案 0 :(得分:1)

这可以通过改变两个.* s:

的贪婪来解决
(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*?[\n](?<value>.*)[\n].*?end code (?<key>[A-Za-z-]*)

阅读语言后.*必须不那么贪心,因为我们需要在第一个换行符之后的内容作为片段值。但是,用于解析.*的{​​{1}}可能更贪婪,因为它不应该在遇到第一个value时停止,因此就是上述模式。

答案 1 :(得分:0)

如果你想要,你可以用一些外观的东西来捕捉......

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