【发布时间】:2010-01-12 12:38:42
【问题描述】:
在 c#-regex 中解析以下块的最佳做法是什么?
BLOCK:1 { name:Apple, value:Juice, name:xxx, value:yyy, name:Apple, value:Juice }
块:2 {名称:香蕉,价值:气味}
块:3 { }
已编辑:灵活块
【问题讨论】:
标签: c#
在 c#-regex 中解析以下块的最佳做法是什么?
BLOCK:1 { name:Apple, value:Juice, name:xxx, value:yyy, name:Apple, value:Juice }
块:2 {名称:香蕉,价值:气味}
块:3 { }
已编辑:灵活块
【问题讨论】:
标签: c#
以下内容应为您提供表达式和组 'id'、'name' 和 'value' 以供进一步使用。
BLOCK:(?<id>[0-9+]) { name:(?<name>.+), value:(?<value>.+) }
然后您可以用换行符分割块,并尝试使用正则表达式解析每一行,如果匹配成功则处理它们。
Regex pattern = new Regex("BLOCK:(?<id>[0-9]+) { name:(?<name>.+), value:(?<value>.+) }");
foreach(var line in block.Split('\n'))
{
Match match = pattern.Match(line);
if(match.Success)
{
Process(match.Groups["value"].Value);
}
}
编辑
使用BLOCK:(?<id>[0-9]+) {(?<inner>.+)} 之类的东西来进行第一场比赛。
然后查看this question了解更多信息
【讨论】:
.+ 是贪心的,您可能希望将其限制为\w+ 或[^,}]+。至少,把它变成一个非贪婪的.+?。
这可能太简单了,不需要 Antlr,但检查一下以供将来参考不会有什么坏处。
如果您需要解析任何相当复杂的东西,那么您就无法击败http://www.antlr.org/
当然,它是相关的 GUI - http://www.antlr.org/works/index.html
一张图说一千个字——http://www.antlr.org/works/screenshots/editor.jpg
代码更简单,调试更简单......
【讨论】: