【问题标题】:C# Advanced Tag ParsingC# 高级标签解析
【发布时间】:2019-08-08 11:25:01
【问题描述】:

我们正在开发一个应用程序,我们需要能够从标签生成文本字符串,例如可用于生成 csv 文件、sql 语句等,这些标签代表软件中的数据源。

这旨在让最终用户在如何从软件中提取数据方面具有最大的灵活性,它与文件编写器、数据库连接器、MS Word 文档解析器等模块相结合......

基本思想是有这样的标签格式{SourceObject.Item("formatting")}

然后哪个标签可以用作INSERT INTO mydb (myfield) VALUES ("{SourceObject.Item("formatting")}");

棘手的地方是我们可能有一个源对象数组的数据,这意味着标签可能开始变得相当复杂:

{SourceObject(12).Item("formatting")}

{SourceObject("ITEM17").Item("formatting")}

以生成具有特定名称的文本文件为例:

myfile {System.Date("DD_MM_YY HH:NN")}.txt 会产生 myfile 08_08_19 12:22.txt

我们可以从头写一个解析器,但我相信这种类型的解析器比较常见,也许类似的方法或现有的解析器可以完成这项工作?

【问题讨论】:

    标签: c# parsing tags


    【解决方案1】:

    您无需额外的库即可实现您的目标,所有示例都可以使用简单的正则表达式处理:{([\w]+)(?:\("([^"]+)"\)|\(([^\)]+)\))*\.([\w]+)\("([^"]+)"\)}

    此 RegEx 涵盖了您发布的所有案例:

    • {SourceObject(12).Item("formatting")} 产生以下内容:
      • 第 1 组:SourceObject
      • 第 3 组:12
      • 第 4 组:Item
      • 第 5 组:formatting
    • {SourceObject("ITEM17").Item("formatting")} 产生以下内容:
      • 第 1 组:SourceObject
      • 第 2 组:ITEM17
      • 第 4 组:Item
      • 第 5 组:formatting
    • myfile {System.Date("DD_MM_YY HH:NN")}.txt 产生以下内容:
      • 第 1 组:System
      • 第 4 组:Date
      • 第 5 组:DD_MM_YY HH:NN
    • 等等..

    在 C# 中就像下面的代码一样简单:

    private static Regex tagParsing = new Regex(
        @"{([\w]+)(?:\(""([^""]+)""\)|\(([^\)]+)\))*\.([\w]+)\(""([^""]+)""\)}", 
        RegexOptions.Compiled);
    
    public static void TestMethod()
    {
        Match m = tagParsing.Match(@"myfile {System.Date(""DD_MM_YY HH:NN"")}.txt");
    }
    

    您只需要记住RegexOptions.Compiled 选项并重用已编译正则表达式的同一实例,否则您将受到性能影响。

    【讨论】:

    • 谢谢,性能如何?我对正则表达式的体验很糟糕,因为它真的很慢。想象一下解析一个 15 页的 word 文档。
    • 很难回答这样一个笼统的问题:正则表达式越具体,它的性能就越好。例如,如果您知道您的令牌只能包含字母,您最好将\w 替换为A-Za-z,等等。这在所有 Regex 实现中通常都是正确的。在 C# 中,如果您不小心忘记使用 RegexOptions.Compiled 或没有重用已编译的实例,我确信您的性能很慢并且 CPU(和/或 RAM)的使用率很高。我们对大于 15 页 Word 文档的数据集使用正则表达式,没有问题。
    • 测试了一下,1000字的文档用编译选项大概需要2s,但我觉得可以接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多