【问题标题】:Regular expression parsing block正则表达式解析块
【发布时间】: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#


    【解决方案1】:

    以下内容应为您提供表达式和组 '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:(?&lt;id&gt;[0-9]+) {(?&lt;inner&gt;.+)} 之类的东西来进行第一场比赛。

    然后查看this question了解更多信息

    【讨论】:

    • 对不起。改变了问题。当我想要一些可扩展的块名称和值时怎么办?
    • .+ 是贪心的,您可能希望将其限制为\w+[^,}]+。至少,把它变成一个非贪婪的.+?
    【解决方案2】:

    这可能太简单了,不需要 Antlr,但检查一下以供将来参考不会有什么坏处。

    如果您需要解析任何相当复杂的东西,那么您就无法击败http://www.antlr.org/

    当然,它是相关的 GUI - http://www.antlr.org/works/index.html

    一张图说一千个字——http://www.antlr.org/works/screenshots/editor.jpg

    代码更简单,调试更简单......

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2012-07-08
    • 2010-10-23
    • 2017-07-10
    相关资源
    最近更新 更多