【问题标题】:Yet Another MultiLine Group Regex Query又一个多行组正则表达式查询
【发布时间】:2013-03-25 10:31:14
【问题描述】:

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

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

  • 一个来识别一个sn-p
  • 一种可选的语言来格式化每个sn-p
  • ,表示开始和结束标记之间的所有行

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

但是当我引入第二行的 sn-p 时,我只得到最后一行:

// 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 上提出的类似场景,但它们对我的使用不起作用。

【问题讨论】:

  • 使用 SingleLine 而不是 Multiline to "."匹配“\n”? stackoverflow.com/questions/289440/…
  • 我想解析任何类型的文本文件——不仅仅是 XML。我可以用 C# 或 ruby​​ 或任何具有 cmets 的语言来做示例......

标签: c# .net regex


【解决方案1】:

这可以通过改变两个.*s 的贪婪来解决:

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

阅读语言后的.*一定要少一些贪心,因为我们需要第一个换行后的内容作为sn-p值。但是,用于解析value.* 可能更贪婪,因为它不应该在遇到第一个\n 时停止,因此上述模式。

【讨论】:

  • 谢谢!正是我需要的!
【解决方案2】:

如果你愿意,你也可以用一些环视的东西来捕捉......

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

【讨论】:

  • 我有一个更容易容忍空白的版本,但我也希望支持任何具有 cmets 的文本文件。因此,在这种情况下,寻找 XML 打开/关闭注释标签对我没有帮助。
  • 如果需要,总是可以跳过打开/关闭标签 :) 以为你希望它是严格的:P
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多