另一个多行组正则表达式查询

本文关键字:正则表达式 查询 另一个 | 更新日期: 2023-09-27 18:05:35

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

我想从每个匹配中得到三个东西:

  • 一个来标识代码段
  • 一个可选的语言来格式化每个代码段
  • ,表示开始和结束标签之间的所有行

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

给出期望值:

    <
  • 键/strong>: foo
  • 语言>:csharp
  • value: var x = 1;

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

// code start foo csharp
var x = 1;
var y = 2;
// end code foo 
    <
  • 键/strong>: foo
  • 语言>:csharp
  • value: var y = 2;

代替

  • :var x = 1;'r'nvar y = 2;(或相似的)

让组覆盖多行,我错过了什么?

我看过在SO上提出的类似场景,但它们对我的使用不起作用。

另一个多行组正则表达式查询

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

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

读取语言后的.*必须不那么贪婪,因为我们需要第一个新行之后的内容作为片段值。然而,解析value.*可能更贪婪,因为它不应该在遇到第一个'n时停止,因此出现了上面的模式。

如果你愿意,你也可以用一些look - around的东西来做catch…

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