2013-03-25 43 views
0

所以我想写一个正则表达式来过滤特定片段的文本文件(寻找速度而不是蛮力)。另一个MultiLine组正则表达式查询

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

  • 一个关键标识片断
  • 可选语言格式化的每个片段中
  • 代表所有起始和结束标签之间的行

这是正则表达式(一个失败的测试工具可以在这里找到 - 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 

给我的预期值:

  • 关键:富
  • 语言:csharp的
  • var x = 1;

但是,当我介绍一个片段与第二排我只得到了最后一排:

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

而不是

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

有什么我错过了获得群体覆盖多行?

我看过在SO上提出的类似场景,但他们没有用于我的用法。

+0

使用单线,而不是多到“”匹配“\ n”? http://stackoverflow.com/questions/289440/cannot-get-regular-expression-work-correctly-with-multiline – Lanorkin 2013-03-25 10:38:40

+0

我想解析任何类型的文本文件 - 不只是XML。我可以用C#或红宝石或任何有意见的语言来做样本... – 2013-03-25 10:38:55

回答

1

这可以通过改变两个.* S中的贪婪,周围的工作:

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

.*阅读的语言必须是贪心不足,因为我们需要的第一个新行作为后的内容后,代码段值。然而,解析value.*可能更贪婪,因为它不应该在遇到第一个\n时停止,因此上述模式。

+0

谢谢!正是我需要的! – 2013-03-25 10:44:02

0

如果你愿意,你可以做抓一些环视的东西,以及......

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

我有一个更方便的空白容忍版本,但我也希望支持任何文本文件有评论。所以在这种情况下寻找XML开放/关闭评论标签不会帮助我。 – 2013-03-25 12:47:56

+0

如果需要,总是可以跳过打开/关闭标签:)以为你希望它是严格的:P – cyberzed 2013-03-25 13:33:53