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

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...