【问题标题】:Parse custom tags to get attributes out for data parsing解析自定义标签以获取属性以进行数据解析
【发布时间】:2010-06-20 14:25:11
【问题描述】:

您好,我正在寻找清理标签或至少从文本中的自定义标签中获取数据的最佳实践或想法。

我确信我可以编写某种“解析器”,它会手动遍历每一行,但今天不是有一些更聪明的方法吗?

数据思考:

{电话:555-123456789}

这里我们将“电话”作为键,将数字作为数据。看起来很像 JSON 格式,但更容易为人类编写。

{link:   article123456  ;    title:    Read about article 123456 here   } 

也可以是普通的 (X)HTML:

<a         href="article123456.html"      >  Read about article 123456 here  </a>

人类并不总是善于“修剪”他们的输入,用懒惰的所见即所得编辑器制作的旧网站也不是,所以我首先需要弄清楚哪些对属于一起,然后在找到“内部数据”之后修剪结果.

问题在于上面的“标题”部分,标题文本周围没有“”,因此它可以自动添加它们或将错误显示给人类。

对如何以最佳方式获取这些数据有任何想法吗?似乎有几种方法可能有效,但您解决此问题的最佳方法是什么?

【问题讨论】:

  • 我想提一下,我同意@tlayton 的回答,所以如果有的话,用不同的标记器回答也会很棒?

标签: c# input intellisense text-parsing


【解决方案1】:

我会首先为我正在解析的数据的语法编写一个“标记器”。标记器是一个(相对)简单的过程,它将字符串分解为一系列片段或标记。例如,在前两种情况下,您的基本标记将包括:“{”、“}”、“:”、“;”,其他所有内容都将被解释为数据标记。这可以通过循环、递归函数或许多其他方式来完成。标记您的第二个示例将生成具有以下值的数组(或某种其他类型的列表):

"{", "link", ":", "   article123456  ", ";", "    title", ":", "    Read about article 123456 here   ", "}"

下一步将是“清理”您的数据,但在这些情况下,真正意味着删除不需要的空白。遍历生成的令牌数组,并更改每个令牌,以便没有开始或结束空格。这一步可以与标记化结合起来,但我认为分开做会更清晰、更清晰。您的令牌将如下所示:

"{", "link", ":", "article123456", ";", "title", ":", "Read about article 123456 here", "}"

最后是实际的“解释”。您需要将令牌数组转换为您打算成为解析过程最终产品的任何类型的实际数据结构。为此,您肯定需要一个递归函数。如果函数在数据标记上调用,然后是冒号标记,然后是数据标记,它将在键值对中解释它们,并相应地生成数据结构。如果在一系列带有分号标记的标记上调用它,它将在每个分号处拆分标记并在每个结果组上调用自身。如果它被包含在大括号标记中的标记上调用,它会在执行任何其他操作之前在包含的标记上调用自己。请注意,这不一定是您要检查这些不同情况的顺序;特别是,如果您打算嵌套花括号(或任何其他类型的分组标记,例如方​​括号、尖括号或圆括号),接下来您将确保以正确的嵌套顺序解释这些标记。

这些过程的结果将是您想要的任何类型的完全解析的数据结构。请记住,此过程假定您的数据全部隐式存储为字符串类型;如果您希望对“3”和 3 进行不同的解释,那么事情会变得有点复杂。我概述的这种方法根本不是唯一的方法,但它是我解决问题的方法。

【讨论】:

  • 没错,很像语言解析器。多年前,我为 SQL 解析和正在接受教育的 Pascal 编写了一些“精简版”版本——是的,确实有效。但是我想知道今天的现代 .NET API 或此后开发的一些模式是否有任何“技巧”。并不是说我不同意你的观点,但我也希望看到其他方式 - 或者可能是一些不同的“标记器”:o)
猜你喜欢
  • 2018-10-12
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多