C# 另一个多行组Regex查询
所以我试图编写一个正则表达式来过滤文本文件中的特定片段(寻找速度而不是暴力) 我想从每场比赛中得到三样东西:C# 另一个多行组Regex查询,c#,.net,regex,C#,.net,Regex,所以我试图编写一个正则表达式来过滤文本文件中的特定片段(寻找速度而不是暴力) 我想从每场比赛中得到三样东西: 用于标识代码段的键 一种可选的语言,用于格式化每个代码段 值,表示开始标记和结束标记之间的所有行 这是正则表达式(此处可以找到失败的测试线束-): (?s)代码开始(?[A-Za-z-]*)(?[A-Za-z]*).[\n](?*?)[\n].*结束代码(?[A-Za-z-]*) 使用以下选项:RegexOptions.Compiled | RegexOptions.Explicit
- 用于标识代码段的键
- 一种可选的语言,用于格式化每个代码段
- 值,表示开始标记和结束标记之间的所有行
(?s)代码开始(?[A-Za-z-]*)(?[A-Za-z]*).[\n](?*?)[\n].*结束代码(?[A-Za-z-]*)
使用以下选项:RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.Multiline
这样的文件:
// code start foo csharp
var x = 1;
// end code foo
为我提供了期望值:
- 键:foo
- 语言:csharp
- 值:
变量x=1代码>
// code start foo csharp
var x = 1;
var y = 2;
// end code foo
- 键:foo
- 语言:csharp
- 值:
变量y=2代码>
- 值:
变量x=1\r\nvar y=2代码>(或类似)
我已经查看了SO上提出的类似场景,但它们对我的使用不起作用。这可以通过更改两个
*
的贪婪度来解决:
(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*?[\n](?<value>.*)[\n].*?end code (?<key>[A-Za-z-]*)
(?s)代码开始(?[A-Za-z-]*)(?[A-Za-z]*)。?[\n](?*)[\n].*结束代码(?[A-Za-z-]*)
阅读该语言后的
*
必须不那么贪婪,因为我们需要第一行新行后面的内容作为代码段值。但是,用于解析值的*
可能更贪婪,因为它不应该在遇到第一个\n
时停止,因此出现了上述模式。如果您愿意,还可以使用一些环视工具来捕获
(?<=code\sstart\s)(?<key>\b\w+\b)\s(?<language>\b\w+\b).*\r\n(?<content>(?s).*)(?=\r\n.*end\scode\s\1\s-->)
(?)
将单线改为多线以“.”匹配“\n”?我想解析几乎任何类型的文本文件,而不仅仅是XML。我可以用C#或ruby或任何有评论的语言来做这个示例…谢谢!正是我需要的!我手头有一个更能容忍空白的版本,但我也希望支持任何文本文件有注释的内容。因此,在这种情况下,查找XML打开/关闭注释标记对我没有帮助。如果需要,可以随时跳过打开/关闭标记:)虽然您希望它严格:P