0

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

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

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

这是正则表达式(可以在此处找到失败的测试工具 - 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 上提出的类似场景,但它们对我的使用不起作用。

4

2 回答 2

1

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

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

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

于 2013-03-25T10:41:06.157 回答
0

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

(?<=code\sstart\s)(?<key>\b\w+\b)\s(?<language>\b\w+\b).*\r\n(?<content>(?s).*)(?=\r\n.*end\scode\s\1\s-->)
于 2013-03-25T11:12:56.290 回答