最近实现的一个分离文章内容功能,挺有意思,分享一下

简介: 这个功能的描述是:把一本符合markdown语法写的书里面的所有大章节里面内容的每个大标题和该标题对应下的内容做分离,一 一对应。一般会出现这种问题的场景:笔试算法题产品需求举个例子,有一段内容是如下:### 糖尿病的症状 (这是 markdown 的第三级标题)初期的症状体现在.....分离后要求达到:title ===> 糖尿病的症状content ===> 初期的症状体现在...对我而言,这个功能的目的是:我们把一本书分割成上述的样子,数据存入数据库。

这个功能的描述是:

把一本符合markdown语法写的书里面的所有大章节里面内容的每个大标题和该标题对应下的内容做分离,一 一对应。

一般会出现这种问题的场景:

  • 笔试算法题
  • 产品需求

举个例子,有一段内容是如下:

### 糖尿病的症状 (这是 markdown 的第三级标题)
初期的症状体现在.....

分离后要求达到:

title   ===> 糖尿病的症状
content ===> 初期的症状体现在...

对我而言,这个功能的目的是:

我们把一本书分割成上述的样子,数据存入数据库。供搜索使用。搜索方式,以 title 或 content 做模糊匹配,命中即返回。

相信看到这里的读者都能清楚知道上面谈的是什么,但愿我的文字能通俗易懂,文字多了,我也记不住,累赘。

实现思路:

  • 正则匹配 ------------- ①
  • 逐行处理 ------------- ②

先谈谈正则匹配下的处理:

  • 优点
    • 写好匹配式,其它交给 API,方便
  • 缺点
    • 难度大,上述问题的内容掺杂情况有很多种

然后是逐行处理处理:

  • 优点
    • 逻辑可控,可丰富自定义处理,例如过滤和二重分割,属于完整的字符串操作
    • 代码清晰,速度快一些
  • 缺点
    • 消耗内存多一些

两种方法的对比:

  • 效率,平分
  • 可读性,② > ①
  • 整体内存占比,② > ①

举个例子对比:

标题有下面的 markdown 代码形式:
###   第一种标题
####  第二种
##### 第三种[点我](http://www.xxx.com)
### ``第四种``
### <strong>第五种,嵌套html标签</strong>
...
采用正则表达式处理的时候

对于上面的情况,第一次的正则拿出标题内容很简单,例如这个: ###? 从三个#号开始贪婪匹配。这样我们可以拿出标题,但是标题里面还掺杂着一些其他标签。你会想,有没有可能在正则匹配就把掺杂的标签去掉。那这个是肯定可以的,代价就是高超的正则匹配式子,且现在还没考虑内容的情况。

为什么非要去掉标签呢? 因为这是标题,标题将会被用作搜索的 key,且返回给前端的时候,你不能把这个解析符号也给前端对吧?去掉了有以下好处:

  • 减少搜索的 o(n)
  • 方便显示
采用逐行处理的时候

我们从文件中读出第一行 ### 第一种标题,replace 函数处理掉 ### 等符号,这里循环处理即可去掉指定的任何符号。
读出第三行的时候 ##### 第三种[点我](http://www.xxx.com),处理掉,##### [ ] ( 等,剩下就是完美:第三种点我

看到这,你是否觉得事情变简单了?

我们知道 markdown 的非标题内容部分,符号和标签更是多种多样,如果我们用正则解决,假设标题能完美处理,那么内容怎么办呢? > 如果去掉内容的其他无用标签,或者要求特定保存一些,等情况,多批次的正则过滤将会是花销巨大的操作。

解决流程:

无论是正则匹配方案 还是 逐行处理方案,这两种我都写了对应的引擎函数,通过且以后者运行谓之0 bug。实现的时间加起来不足 3.5 小时。后者尤其快,下面我仅主要介绍后者的解决流程

先明确几个细节点
  • 只有标题没对应内容,自动补充为空字符串
  • 只有内容没对应标题,不录入
例如
内容66655
####  标题一
####  标题二
456789....

输出:

title[0] ===> "标题一" , content[0] ===> ""
title[0] ===> "标题二" , content[0] ===> "456789...."

流程图

img_aea3098659b20edb5202c012f62951ae.png

至此,已经很简答,例如 Java 语言的 String API startWith 就能用在判断是否是titleif(startWith"####")
过滤方面,replace 之类的函数,等都可以。公司代码,不便公开。

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力


img_12e3f54d4d0f70f0eb14f20548e3d781.png
目录
相关文章
|
存储 设计模式 缓存
通用点赞设计思路
点赞作为一个高频率的操作,如果每次操作都读写数据库会增加数据库的压力,所以采用缓存+定时任务来实现。点赞数据是在redis中缓存半小时,同时定时任务是每隔5分钟执行一次,做持久化存储,这里的缓存时间和任务执行时间可根据项目情况而定。
2120 2
|
SQL 数据采集 存储
大数据采集和抽取怎么做?这篇文章终于说明白了!
数据是数据中台\数据平台核心中的核心,因此数据汇聚必然是数据中台/平台的入口,本文详细讲述采集模块的方方面面、采集框架的使用选型以及企业真实落地
大数据采集和抽取怎么做?这篇文章终于说明白了!
|
1月前
|
网络安全 网络性能优化 数据中心
想要丝滑地使用ACL,少不了这篇干货~
想要丝滑地使用ACL,少不了这篇干货~
|
4月前
|
机器学习/深度学习 自然语言处理 数据挖掘
ChatGPT创作内容的底层逻辑
ChatGPT创作内容的底层逻辑
71 4
ChatGPT创作内容的底层逻辑
|
11月前
|
API iOS开发 wax
1.读对象模型一段文字摘抄 (唐巧高阶开发笔记)
1.读对象模型一段文字摘抄 (唐巧高阶开发笔记)
40 0
|
12月前
|
人工智能 移动开发 测试技术
你的交互文档写的好不好?一看便知!
你的交互文档写的好不好?一看便知!
109 0
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
79 0
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
|
安全 Java 数据库
10分钟完成补充个人博客留言设计贴功能
10分钟完成补充个人博客留言设计贴功能
130 0
10分钟完成补充个人博客留言设计贴功能
|
程序员 Android开发
补充|程序猿技术干货资源【附源码】
上次,发布了篇 程序猿充电优质编程技术电子书 ,得到了很多同行的认可和点赞,我感觉我付出时间和精力收集的资源对大家有帮助,还是很值得的,下次会继续推送编程干货。但是,有个认真的圈友,在公众号后台私聊我说,第一本书《第一行代码》不是第2版,我认真看了发现确实不是,亏了那名圈友,感谢他的分享我拿到了郭霖的《第一行代码》第2版电子书了。下面把这本书和书里的源代码给大家送过去,希望大家在Android 开发中,可以快速入门和取得技术上的进步。
91 0
补充|程序猿技术干货资源【附源码】