当前位置: 首页 > 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. 多层…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...