解析自定义标记以获取属性以进行数据解析

时间:2010-06-20 14:25:11

标签: c# input intellisense text-parsing

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

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

数据提示:

  

{电话:555-123456789}

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

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

也可能是正常的(X)HTML:

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

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

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

关于如何以最佳方式获取这些数据的任何想法?似乎有几种方法可行,但你最好的解决这个问题的方法是什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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