当前位置: 首页 > news >正文

Apache Commons Text 指南:比 String 更强大的文本处理工具

Apache Commons Text 指南:比 String 更强大的文本处理工具

在 Java 开发中,String 类是处理文本的基础工具,但当面对复杂的文本处理需求时,其局限性就显而易见了。Apache Commons Text 提供了一个更加灵活强大的文本处理工具集,大幅简化了开发过程,减少了重复代码的编写。

什么是 Apache Commons Text?

Apache Commons Text 是 Apache Commons 项目的一部分,提供了多样化的字符串操作功能。这不仅包括简单的字符串替换和生成,还涵盖了更复杂的场景,如字符转义、字符串相似度计算等。在开发高效、健壮的 Java 应用时,这个库能大大减少你在文本处理方面的烦恼。

如何引入依赖

在你的 Maven 项目中加入 commons-text 依赖:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-text</artifactId><version>1.12.0</version>
</dependency>

然后运行 mvn clean install,确保项目正确加载依赖。

核心功能详解

Apache Commons Text 提供了很多 Java String 类没有的高级文本处理功能。接下来我们通过几个实际的开发场景来展示这些工具的强大。

1. 动态字符串替换

在某些场景下,需要根据上下文动态替换字符串中的占位符。StringSubstitutor 是处理这种需求的最佳工具:

import org.apache.commons.text.StringSubstitutor;import java.util.HashMap;
import java.util.Map;public class Example {public static void main(String[] args) {Map<String, String> valuesMap = new HashMap<>();valuesMap.put("name", "小明");valuesMap.put("date", "2024年10月");String templateString = "你好,${name}!您的账号将在${date}过期。";StringSubstitutor sub = new StringSubstitutor(valuesMap);String resolvedString = sub.replace(templateString);System.out.println(resolvedString);}
}

此工具允许你通过占位符的形式,将动态内容嵌入到固定文本中。

2. 字符转义与反转义

在处理 Web 应用时,经常会涉及到 HTML 和 XML 的字符转义。StringEscapeUtils 为此提供了一系列方法,避免手动处理繁琐的转义逻辑:

import org.apache.commons.text.StringEscapeUtils;public class EscapeExample {public static void main(String[] args) {String html = "<h1>欢迎来到我的网站</h1>";String escapedHtml = StringEscapeUtils.escapeHtml4(html);System.out.println("转义后的HTML: " + escapedHtml);}
}

在这个例子中,escapeHtml4() 自动将特殊字符转义为其对应的 HTML 实体。

3. 字符串相似度计算

在用户搜索、文本纠错等场景下,需要判断两个字符串的相似程度。LevenshteinDistance 是一个通过计算编辑距离(插入、删除、替换操作)来测量字符串差异的实用工具:

import org.apache.commons.text.similarity.LevenshteinDistance;public class SimilarityExample {public static void main(String[] args) {LevenshteinDistance distance = new LevenshteinDistance();String str1 = "kitten";String str2 = "sitting";int result = distance.apply(str1, str2);System.out.println("Levenshtein 距离: " + result);}
}

这种编辑距离计算在拼写检查或搜索优化中尤为常见。

4. 随机字符串生成

RandomStringGenerator 用于生成随机字符串,是创建密码、验证码等需求的理想选择:

import org.apache.commons.text.RandomStringGenerator;public class RandomStringExample {public static void main(String[] args) {RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('a', 'z').build();String randomString = generator.generate(10);System.out.println("随机生成的字符串: " + randomString);}
}

你可以根据具体需求定制随机字符串的字符范围和长度。

5. Tokenizer:灵活的字符串拆分

虽然 Java 自带的 String.split() 已经能满足基本的字符串拆分需求,但 StringTokenizer 提供了更复杂的分割操作选项:

import org.apache.commons.text.StringTokenizer;public class TokenizerExample {public static void main(String[] args) {StringTokenizer tokenizer = new StringTokenizer("Java,Python,Go", ',');while (tokenizer.hasNext()) {System.out.println(tokenizer.next());}}
}

StringTokenizer 提供了分割操作中的更多灵活性,支持自定义分隔符和分割策略。

6. 处理大小写

在不同的项目中,处理字符串的大小写格式经常会成为常见需求。CaseUtils 通过简单的接口,允许你轻松转换字符串的命名风格:

import org.apache.commons.text.CaseUtils;public class CaseUtilsExample {public static void main(String[] args) {String input = "my_test_string";String camelCase = CaseUtils.toCamelCase(input, false, '_');System.out.println(camelCase);  // 输出 myTestString}
}

CaseUtils.toCamelCase() 能快速将下划线分隔的字符串转换为驼峰命名法。

7. TextStringBuilder:增强的 StringBuilder

TextStringBuilderStringBuilder 的增强版本,它提供了更强大的链式操作和格式化功能,尤其适合需要频繁修改、拼接的字符串场景:

import org.apache.commons.text.TextStringBuilder;public class TextStringBuilderExample {public static void main(String[] args) {TextStringBuilder builder = new TextStringBuilder();builder.append("Hello").appendNewLine().append("World");System.out.println(builder.toString());}
}

通过这种增强的 API,你可以轻松实现复杂的字符串操作。

8. 过滤字符

CharacterPredicates 结合 RandomStringGenerator,允许你根据字符类型过滤生成的随机字符串,确保字符串仅包含特定类型的字符:

import org.apache.commons.text.CharacterPredicates;
import org.apache.commons.text.RandomStringGenerator;public class PredicateExample {public static void main(String[] args) {RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('0', 'z').filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS).build();String randomString = generator.generate(10);System.out.println(randomString);}
}

这个例子展示了如何生成仅包含字母和数字的随机字符串。

结论

Apache Commons Text 不仅弥补了 Java 原生 String 类的局限性,还提供了丰富的文本处理工具,从简单的字符串替换到复杂的相似度计算和字符过滤。这些功能可以大幅提高开发效率,使代码更简洁易读。

扩展阅读:

  • Apache Commons Text 官方文档
  • Levenshtein 距离计算原理

相关文章:

Apache Commons Text 指南:比 String 更强大的文本处理工具

Apache Commons Text 指南&#xff1a;比 String 更强大的文本处理工具 在 Java 开发中&#xff0c;String 类是处理文本的基础工具&#xff0c;但当面对复杂的文本处理需求时&#xff0c;其局限性就显而易见了。Apache Commons Text 提供了一个更加灵活强大的文本处理工具集&…...

C++面向对象编程学习

C面向对象编程学习 前言一、C面向对象编程二、知识点学习1. 定义一个类1.1 使用struct定义1.2 使用class定义1.3 struct和class的区别 2. 类的定义方式2.1 单文件定义&#xff08;Inline Definition&#xff09;2.2 分离定义&#xff08;Separate Definition&#xff09;2.3 头…...

云轴科技ZStack亮相迪拜GITEX大会,与阿里云再次携手深化海外合作

10月14至18日&#xff0c;全球顶尖科技盛会GITEX GLOBAL 2024在迪拜拉开帷幕&#xff0c;云轴科技ZStack携全系云计算解决方案与全新AIOS智塔平台参展&#xff0c;向全球观众展示智算时代下的新一代智算化算力平台。 GITEX GLOBAL 2024是当今世界上最具前瞻性兼包容性的大型科技…...

SQL Server 当前日期及其未来三天的日期

当前日期及其未来三天的日期&#xff0c;并分别以 YYYY-MM-DD 和 yyyyMMdd 的格式展示 1、当前日期及其未来三天的日期&#xff0c;以 YYYY-MM-DD的格式展示 WITH CurrentDate AS (SELECT GETDATE() AS 当前日期 ) -- 使用 CONVERT 函数 SELECTCONVERT(VARCHAR(10), 当前日期,…...

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC&#xff08;Quick UDP Internet Connections&#xff09;和 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是两种不同的网络传输协议&#xff0c;它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP&#xff1a;QUIC 建立在 UDP 之上&#xff…...

双十一送你一份购物攻略,绿联NAS DXP2800评测

一年一度双十一&#xff0c;今年双十一来得特别早&#xff0c;所以最近已经看到不少人在讨论双十一买了啥&#xff0c;NAS的讨论度也挺高的。正好&#xff0c;是我比较懂的领域。作为一位资深的数码爱好者&#xff0c;同时也是绿联DH2600DXP2800双持用户&#xff0c;可以说我是…...

基于vue框架的的高校设备信息管理系统的设计与实现tx6d7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;设备管理员,设备维护员,设备类别,设备,设备入库,设备分发,设备调拨,定期维护,维护任务,设备运行记录 开题报告内容 基于Vue框架的高校设备信息管理系统的设计与实现开题报告 一、项目背景及意义 随着高校教育事业的蓬勃发展&#xff…...

springboot3.x使用@NacosValue无法获取配置信息问题解决

一、问题描述 springboot从2.x升级到3.x后&#xff0c;nacos的依赖包需要改成Spring Cloud的依赖包才能继续使用。升级好以后&#xff0c;首先&#xff0c;确定我的项目是能够连上nacos并且加载到配置信息的&#xff0c;因为数据库等信息都是从nacos加载过来&#xff0c;能够正…...

sql获取时间差

MySQL SELECT TIMESTAMPDIFF(HOUR, 2023-10-01 12:00:00, 2023-10-02 15:30:00) AS hours_difference; PostgreSQL //EXTRACT(EPOCH FROM (2023-10-02 15:30:00::timestamp - 2023-10-01 12:00:00::timestamp)) // 获取的是两个时间相差的秒数&#xff0c;在此基础上除3600获…...

【深入理解Python中的闭包】如何有效使用嵌套函数和状态捕获!

深入理解Python中的闭包&#xff1a;如何有效使用嵌套函数和状态捕获 Python 作为一种动态的编程语言&#xff0c;允许我们用多种方式来设计和构建功能&#xff0c;其中之一就是 闭包&#xff08;Closure&#xff09;。闭包是一种强大的特性&#xff0c;可以帮助我们捕获和保持…...

npm配置阿里镜像库教程

为了配置npm使用阿里镜像库&#xff0c;可以按照以下步骤进行操作。这些步骤将帮助你加快包的下载速度&#xff0c;特别是在中国地区&#xff0c;因为阿里镜像库通常比官方npm仓库响应更快。 1. 配置全局镜像 可以通过运行以下命令来将npm的全局镜像配置为阿里镜像&#xff1…...

Apache JMeter压力测试工具使用

JMeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。 01 软件下载 下载地址: https://jmeter.apache.org/download_jmeter.cgi 最新版本5.6.2 用浏览器下载发现慢得很&#xff0c;用迅雷下载非常快哟。 02 测试使用 在使用前需要先安装jd…...

前端零基础入门到上班:【Day4】HTML 多媒体与表单深度教程

HTML 多媒体与表单深度教程 **1. HTML 多媒体基础&#xff1a;深入理解 <video> 和 <audio> 标签****1.1 <video> 标签&#xff1a;详细剖析与用法****1.1.1 基础结构与属性详解****1.1.2 视频格式的兼容性与示例****1.1.3 视频控制的实际应用** **1.2 <a…...

原创作品——银行软件产品界面设计

蓝蓝设计团队服务金融类应用界面设计&#xff0c;以沉稳的色调和简洁的线条营造出专业可靠的氛围。特点在于融入了创新的元素增添界面的活力与现代感。细节处理上&#xff0c;注意数据的视觉呈现效果&#xff0c;采用定制化的图表和清晰的排版&#xff0c;确保用户能够快速理解…...

若依RuoYi-Vue 定时任务 速学

1.若依定时任务模块&#xff08;ruoyi-quartz&#xff09; 那么从一个简单的入门示例开始&#xff0c;掌握定时任务的使用吧&#xff01; 2. 入门示例&#xff08;学会制作一个简单定时任务&#xff09; 首先打开定时任务模块中的task包&#xff0c;这里已经有一个已经写好的R…...

【pytest学习】pytest.main()

基本用法## pytest.main()函数是用于启动测试运行的入口点。它可以在命令行中直接使用&#xff0c;也可以在脚本中以编程方式调用。 以下是一个简单的示例&#xff1a; import pytest if __name__"__main__":pytest.main()执行当前目录下的所有测试文件 使用pytes…...

设计模式: Pimpl(Pointer to Implementation)

这种设计模式通常被称为 Pimpl&#xff08;Pointer to Implementation&#xff09;惯用法&#xff0c;有时也被称为 Cheshire Cat 惯用法。它主要用于隐藏实现细节和减少编译依赖。 例子&#xff1a; DatabaseConnection.h #ifndef DATABASE_CONNECTION_H #define DATABASE_…...

android开发中文网站 android developer

Android 平台 | Platform | Android Developers 在此做个记录...

实习冲刺Day1

算法题 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 这个题我们采用stack栈的方式来进行相应的括号匹配 情况有以下几种 当字符串s中只有一个字符的时候&#xff0c;那这个时候字符串一定是不匹配的所以直接返回false当字符串为发生标准匹配的时候&#xff0c;…...

安全见闻(5)——开阔眼界,不做井底之蛙

安全见闻五&#xff1a;人工智能 内容预览 ≧∀≦ゞ 安全见闻五&#xff1a;人工智能声明导语一、人工智能基础机器学习基础机器学习的典型工作流程1. 数据收集2. 数据预处理3. 模型选择与训练4. 模型评估与优化5. 模型应用 深度学习基础深度学习基本原理1. 神经网络基础2. 多层…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...