所以我正在尝试编写一个正则表达式来过滤特定代码段的文本文件(寻找速度而不是暴力)。
我想从每场比赛中得到三件事:
这是正则表达式(可在此处找到失败的测试工具 - 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
给我预期的价值:
var x = 1;
但是当我引入第二行的片段时,我只得到最后一行:
// code start foo csharp
var x = 1;
var y = 2;
// end code foo
var y = 2;
而不是
var x = 1;\r\nvar y = 2;
(或类似)让小组覆盖多条线路时我错过了什么?
我已经看过在SO上提出的类似场景,但它们并没有用于我的使用。
答案 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-->)