【小黄碎碎念】如何解析和替换字符串中的 Markdown 文本?正则表达式与 flexmark-java 库

news2024/12/24 9:01:22

前言

 本周,笔者将之前的基于 Servlet 的个人博客项目进行了迭代,基于 SpringBoot + SpringMVC + Mybatis + Redis 进行实现。额外实现密码的明文加密处理(加盐算法)、修改博客、公共主页等功能,并将 session 存储到 Redis 中持久化,同时额外实现分页功能并使用对 AOP 思想对用户登录身份验证模块进行升级。emmmm,具体后面会出文章详细介绍。这里先说说遇到的问题:
问题图片
可以发现:在博客的摘要信息中,形如 # 这样的 markdown 标签也一并展示在了博客摘要信息中。

怎么解决呢? 很显然,一种是自己解决,一种是依赖 api:

  • 使用正则表达式对博客正文中的所有 markdown 标签进行匹配,然后使用空字符进行替换;
  • 使用 flexmark-java库来解析和转换 Markdown 文本。

下面,笔者将对两种方式分别进行讲解,并使用正则表达式的方式处理个人博客系统中的该问题。我们接着往下看~


文章目录

  • 前言
  • 1 正则表达式替换 Markdown 文本
    • 1.1 正则表达式简介
    • 1.2 具体实现
  • 2 flexmark-java库解析和转换 Markdown 文本
  • 3 实战:对个人博客系统中的摘要信息处理


1 正则表达式替换 Markdown 文本

1.1 正则表达式简介

正则表达式是一种强大的模式匹配工具,可以用于查找和替换文本中的特定模式。当涉及到在Java中使用正则表达式时,可以使用java.util.regex包提供的类来进行模式匹配、查找和替换操作。以下是一些常用的类和方法:

  1. Pattern类:Pattern类用于表示正则表达式模式。可以使用Pattern.compile()方法将正则表达式编译为一个Pattern对象。

    String regex = "\\d+"; // 匹配一个或多个数字
    Pattern pattern = Pattern.compile(regex);
    
  2. Matcher类:Matcher类用于进行模式匹配操作。可以使用Matcher.matches()方法检查整个输入字符串是否与模式匹配,或使用Matcher.find()方法在输入字符串中查找下一个匹配项。

    String input = "Hello 123 World";
    Matcher matcher = pattern.matcher(input);
    if (matcher.find()) {
        System.out.println("匹配到数字:" + matcher.group());
    }
    
  3. String类的正则表达式方法:String类提供了一些便捷的方法来处理正则表达式,如String.matches()String.replaceAll()String.split()

    String input = "Hello 123 World";
    if (input.matches("\\d+")) {
        System.out.println("输入字符串是一个数字");
    }
    
    String replaced = input.replaceAll("\\d+", "###");
    System.out.println("替换后的字符串:" + replaced);
    
    String[] parts = input.split("\\s+"); // 使用空白字符分割字符串
    System.out.println("分割后的字符串数组:" + Arrays.toString(parts));
    

具体可参考Java官方文档中关于正则表达式的部分:Java 正则表达式

1.2 具体实现

import java.util.regex.Pattern;

public class MarkdownUtils {
    public static String removeMarkdownTags(String markdown) {
        // 匹配Markdown标签的正则表达式
        String regex = "\\*\\*|__|\\*|_|~~|`|\\[\\]|\\(|\\)|\\{|\\}|\\[|\\]|#|\\+|-|\\.|!";
        // 使用空字符串替换Markdown标签
        String result = Pattern.compile(regex).matcher(markdown).replaceAll("");
        return result;
    }
}

在上面的示例中,removeMarkdownTags方法接受一个Markdown格式的字符串作为输入,并使用正则表达式将Markdown标签替换为空字符串,从而去除Markdown标签。


2 flexmark-java库解析和转换 Markdown 文本

首先,需要在项目中添加flexmark-java库的依赖。如果使用 Maven,可以在pom.xml文件中添加以下依赖项:

<dependencies>
    <dependency>
        <groupId>com.vladsch.flexmark</groupId>
        <artifactId>flexmark-all</artifactId>
        <version>0.62.2</version>
    </dependency>
</dependencies>

然后就可以使用flexmark-java库来解析Markdown文本并获取纯文本内容,如下所示:

import com.vladsch.flexmark.html.HtmlRenderer;
import com.vladsch.flexmark.parser.Parser;

public class MarkdownUtils {
    public static String removeMarkdownTags(String markdown) {
        Parser parser = Parser.builder().build();
        HtmlRenderer renderer = HtmlRenderer.builder().build();

        // 将Markdown文本解析为HTML
        String html = renderer.render(parser.parse(markdown));

        // 使用Jsoup库从HTML中获取纯文本内容
        String plainText = org.jsoup.Jsoup.parse(html).text();

        return plainText;
    }

    public static void main(String[] args) {
        String markdown = "**Hello** _world_!";
        String plainText = removeMarkdownTags(markdown);
        System.out.println(plainText);  // 输出: Hello world!
    }
}

在上面的示例中,使用flexmark-java库将Markdown文本解析为HTML,然后使用Jsoup库从HTML中提取纯文本内容。


3 实战:对个人博客系统中的摘要信息处理

在这里,笔者使用正则表达式的方式对博客摘要信息进行处理。
首先,创建一个 MarkdownUtils 工具类,该类就是专门用于处理 Markdown 文本的:

  1. 对摘要进行去除 markdown 标签处理;
  2. 摘要只截取文章正文前的 n 个字符;

MarkdownUtils.java

import java.util.regex.Pattern;

/**
 * @author 兴趣使然黄小黄
 * @date 2023/7/23 23:18
 * 用于处理文章列表的文章摘要信息
 */
public class MarkdownUtils {

    // 匹配Markdown标签的正则表达式
    private static String regex = "\\*\\*|__|\\*|_|~~|`|\\[\\]|\\(|\\)|\\{|\\}|\\[|\\]|#|\\+|-|\\.|!";

    /**
     * 对摘要进行去 markdown 标签处理
     */
    public static String removeMarkdownTags(String markdown, int n) {
        // 先对 markdown 字符串进行截取
        markdown = preprocessingString(markdown, n);
        // 使用空字符串替换Markdown标签并返回
        return Pattern.compile(regex).matcher(markdown).replaceAll("");
    }

    /**
     * 截取正文的前 n 个字符作为摘要
     */
    private static String preprocessingString(String s, int n) {
        if (s == null || s == "" || n <= 0) {
            return "";
        }
        String result = "";
        if (n >= s.length()) {
            result = s.substring(0, s.length());
        } else {
            result = s.substring(0, n);
        }
        return result;
    }
}

编写完代码后,我们进行简单的 单元测试:

@SpringBootTest
class MarkdownUtilsTest {
    @Test
    void removeMarkdownTags() {
        String markdown = "**Hello** _world_";
        String result = MarkdownUtils.removeMarkdownTags(markdown, 256);
        System.out.println(result);
        Assertions.assertEquals("Hello world", result);
    }
}

单元测试结果如下:
单元测试结果
测试没问题后,我们可以着手对项目中的返回文章列表部分进行处理。

在项目中,获取个人博客列表信息的 url 为 /art//mylist , 因此找到对应的 controller,只需要对获取的文章信息对象的列表的正文进行处理后再返回:
bug修改

为了程序后期的维护,我们把摘要的最大字符长度放在了一个公共类进行保存:
公共变量

最后,我们撰写一个很长很长的博文来看看 # 是否会被处理,文章是否会被截取吧~结果如下:
结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习——批标准化Batch Normalization

什么是批标准化&#xff1f; 批标准化&#xff08;Batch Normalization&#xff09;是深度学习中常用的一种技术&#xff0c;旨在加速神经网络的训练过程并提高模型的收敛速度。 批标准化通过在神经网络的每一层中对输入数据进行标准化来实现。具体而言&#xff0c;对于每个输…

我在VScode学Python(Python函数,Python模块导入)

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 &#xff08;1&#xff09;关于Python基本语法学习---->可以参考我的这篇博客《我在VScode学Python》 &#xff08;2&#xff09;pip是必须的在我们学习python这门语言的过程中Python ----&#xff1e;&a…

fl studio 20如何设置中文汉化汇总及flstudio21水果language选项中文设置方法

fl studio这是一个编曲软件&#xff0c;它有中文和英文两种语言供大家选择&#xff0c;对我们来说&#xff0c;中文版肯定更方便。fl studio如何设置中文&#xff1f;事实上&#xff0c;只需在设置中切换中文即可。 我们一起 fl studio 20如何设置中文一些方法 一、fl studio手…

Angular:动态依赖注入和静态依赖注入

问题描述&#xff1a; 自己写的服务依赖注入到组件时候是直接在构造器内初始化的。 直到看见代码中某大哥写的 private injector: Injector 动态依赖注入和静态依赖注入 在 Angular 中&#xff0c;使用构造函数注入的方式将服务注入到组件中是一种静态依赖注入的方式。这种方…

docker中搭建lnmp

目录 一&#xff1a;项目环境 1、主机ip需求 2、 任务需求 二&#xff1a;多级构建Dockerfile实验部署 lnmp 1、先部署一个有所有依赖包的镜像 2、搭建nginx 3、搭建mysql 4、搭建php 三&#xff1a;一级构建安装lnmp 1、构建自定义docker网络 2、构建nginx容器&#x…

办公室安全升级,如何保障人身财产安全?

视频监控&#xff0c;一种常见的安全措施&#xff0c;以监视和记录办公室内的活动。这项技术为企业提供了许多优势&#xff0c;包括保障员工和财产安全、帮助调查犯罪事件、提高业务管理效率以及应对突发事件。 因此&#xff0c;在合理范围内应用视频监控&#xff0c;将为企业提…

LINUX中的myaql(一)安装

目录 前言 一、概述 二、数据库类型 三、数据库模型 四、MYSQL的安装 &#xff08;一&#xff09;yum安装MYSQL &#xff08;二&#xff09;rpm安装MYSQL 五、MYSQL本地登录 rpm安装MYSQL本地登录 六、重置密码 总结 前言 MySQL是一种常用的开源关系型数据库管理系统&#xff…

泛微OA客戶管理融合呼叫中心系统功能

泛微OA&#xff0c;全程数字化运营平台。用户因业务管理需要&#xff0c;crm客户管理流程中&#xff0c;需要通过语音与客户沟通&#xff0c;对话务沟通过程实现流程和过程化管理。 泛微OA中&#xff0c;无需过多编程代码。通过呼叫中心接口快速开发&#xff0c;实现点击拨打&…

【计算机网络】第 3 课 - 计算机网络体系结构

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、常见的计算机网络体系结构 2、计算机网络体系结构分层的必要性 2.1、物理层 2.2、数据链路层 2.3、网路层 2.4、运输层 2…

融合正余弦和柯西变异的麻雀搜索算法优化CNN-BiLSTM,实现多输入单输出预测,MATLAB代码...

上期作者推出的融合正余弦和柯西变异的麻雀优化算法&#xff0c;效果着实不错&#xff0c;今天就用它来优化一下CNN-BiLSTM。CNN-BiLSTM的流程&#xff1a;将训练集数据输入CNN模型中&#xff0c;通过CNN的卷积层和池化 层的构建&#xff0c;用来特征提取&#xff0c;再经过BiL…

(20)操纵杆或游戏手柄

文章目录 前言 20.1 你将需要什么 20.2 校准 20.3 用任务规划器进行设置 20.4 飞行前测试控制装置 20.5 测试失控保护 20.6 减少控制的滞后性 前言 本文解释了如何用操纵杆或游戏手柄控制你的飞行器&#xff0c;使用任务计划器向飞行器发送"RC Override"消息…

【C++基础(六)】类和对象(中) --构造,析构函数

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象-中 1. 前言2. 构造函数3. 构造函数的特性4…

Opencv 细节补充

1.分辨率的解释 •像素&#xff1a;像素是分辨率的单位。像素是构成位图图像最基本的单元&#xff0c;每个像素都有自己的颜色。 •分辨率&#xff08;解析度&#xff09;&#xff1a; a) 图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch) b) PPI表示的是每英…

从零开始 Spring Cloud 7:Gateway

从零开始 Spring Cloud 7&#xff1a;Gateway 图源&#xff1a;laiketui.com Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨…

系统集成|第三章(笔记)

目录 第三章 系统集成专业技术3.1 信息系统建设3.1.1 信息系统3.1.2 信息系统集成 3.2 信息系统设计3.3 软件工程3.4 面向对象系统分析与设计3.5 软件架构3.5.1 软件的架构模式3.5.2 软件中间件 3.6 典型应用集成技术3.6.1 数据库与数据仓库技术3.6.2 Web Services 技术3.6.3 J…

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归时间序列区间预测模型&#xff1…

SpringCloud学习路线(10)——分布式搜索ElasticSeach基础

一、初识ES &#xff08;一&#xff09;概念&#xff1a; ES是一款开源搜索引擎&#xff0c;结合数据可视化【Kibana】、数据抓取【Logstash、Beats】共同集成为ELK&#xff08;Elastic Stack&#xff09;&#xff0c;ELK被广泛应用于日志数据分析和实时监控等领域&#xff0…

java——继承

&#x1f384;&#x1f384;&#x1f384;继承 &#x1f346;&#x1f346;继承的概念&#xff1a; 继承(inheritance)机制&#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类&#xff08;父类&#xff09;特性的基础上进行扩展…

挑战css基础面试题

挑战css基础面试题一&#xff0c;看看你能做出来吗 文章目录 前言一、盒模型二、如何实现一个最大的正方形三、文本一行水平居中&#xff0c;多行居左四、画一个三角形五、BFC理解六、两栏布局&#xff0c;左边固定&#xff0c;右边自适应&#xff0c;左右不重叠最后 前言 本片…