干货|一种C++实现格式化文本解析的方法

点击上方“中兴开发者社区”,关注我们

每天读一篇一线开发者原创好文

干货|一种C++实现格式化文本解析的方法

摘要

本文主要介绍使用C++语言实现有固定格式的文本文件的一种解析方法,和解析函数的主要实现逻辑。


关键词

C++ 文本解析  


背景:

参加“5G LTE挑战杯”活动时,初赛题目要求将plantUML文本按照要求输出指定的格式,我们组采用C++语言进行开发,C++语言基础库处理字符串的函数比较少,无法满足直接解析的需求,因此我们基于strtok以及strtok_s方法实现了格式化文本的解析。


解决思路:

需要解析的文本内容如下图所示。经过对题目以及文本内容进行分析,基本可以将内容分成2大部分,第一部分为文本的头和尾;第二部分为正式内容(契约主体)。而正式内容可根据规律以及其表示的语意每两行分割成一条数据,我们称每条数据的第一行为主消息,第二行为注释。

干货|一种C++实现格式化文本解析的方法

1.正文内容消息结构定义

主要定义了如下结构体,可以完整表示正文每条消息加注释的信息。

干货|一种C++实现格式化文本解析的方法

2.按照关键字识别文本的头和尾特殊处理

通过头和尾的关键字识别出头或者尾的行,解析函数直接返回,由上层调用解析下一行。

头和尾处理的关键代码如下(常量声明、变量声明、异常处理、入参检查等过程已忽略):

干货|一种C++实现格式化文本解析的方法

2.按照语意将正文内容解析组织

识别每一行的第一个单词,根据是否为note区分本行的内容为消息还是注释,分别调用函数ParseNoteContent或ParseMainContent进行处理。

干货|一种C++实现格式化文本解析的方法

在子函数中,使用空格、冒号、逗号将一整行的内容分割成段,再按照每一段在行中的位置将其填入定义的结构体中相应的参数中。

干货|一种C++实现格式化文本解析的方法

干货|一种C++实现格式化文本解析的方法

干货|一种C++实现格式化文本解析的方法

3.函数解析的结果

解析后由上层将每两行解析的结果加入到map中存储,我们对plantUML文件中的每一个细节进行了解析和表达,在系统后续的处理中可以根据需求任意的获取需要的数据。如下图展示的是前两行正文内容解析的结果:

干货|一种C++实现格式化文本解析的方法

干货|一种C++实现格式化文本解析的方法