Java字符编码与正则表达式深度解析
Java字符编码与正则表达式深度解析
1. 字符编码发展
1.1 ASCII 码
在计算机最初发明时,主要用于数值计算,但随着计算需求的增加,人们发现计算机可以用来处理文本信息。因此,将字符映射为数字来表示。
- 字母 ‘A’ 映射为 65,字母 ‘B’ 映射为 66。
- 这种字符与数字的映射关系被称为ASCII字符集。
ASCII 范围:
- 控制字符(0~31 和 127):如换行(LF)、回车(CR)。
- 可显示字符(32~126):如数字 0~9、字母 A-Z 和 a-z,以及标点符号。
示例:
字符 'A' 编码为十进制:65,二进制:01000001
1.2 OEM 字符集的衍生
随着计算需求增加,128个ASCII字符已无法满足多语言环境需求。
- 许多地区在
0x80-0xFF范围中自定义字符映射,形成不同的OEM 字符集。
示例:
- 在甲的机器中
résumés显示正常,而在乙的机器上显示为r?sum?s。
1.3 多字节字符集(MBCS)与中文字符集
亚洲国家的字符需求远超 256 个字符,诞生了多字节字符集:
- GB2312:涵盖所有简体中文字符。
- GBK:在 GB2312 基础上扩展了繁体字符。
多字节字符集特点:
- 若字节最高位为
0,表示单字节字符,与 ASCII 一致。 - 若字节最高位为
1,则需两个字节表示一个字符。
1.4 ANSI 标准与国家标准
ANSI 和 ISO 制定了字符集标准:
- ANSI 编码:英文系统使用
ISO-8859-1,中文系统使用GBK。
1.5 Unicode 的出现
为解决跨国文档中的多语言问题,Unicode 字符集诞生。
- Unicode 为每个字符分配唯一编码值,共 17 个平面,每个平面最多包含 65,536 个字符。
Unicode 编码方案:
- UTF-8:可变长度编码,使用 1~4 个字节表示字符。
- UTF-16:定长编码,每次 16 位。
示例:将 中 (U+4E2D) 编码为 UTF-8:
- Unicode:
01001110 00101101 - UTF-8 规则:
1110xxxx 10xxxxxx 10xxxxxx - 结果:
11100100 10111000 10101101(十六进制E4B8AD)
编码转换示例:
public static void main(String[] args) throws UnsupportedEncodingException {String str = "测试";byte[] utf8Bytes = str.getBytes("UTF-8");byte[] gbkBytes = str.getBytes("GBK");System.out.println("UTF-8 编码长度: " + utf8Bytes.length); // 输出 6System.out.println("GBK 编码长度: " + gbkBytes.length); // 输出 4
}
2. 正则表达式
2.1 基本概念
正则表达式是一种字符串匹配模式,常用于字符串的检索和替换操作。
2.2 常用匹配模式
| 模式 | 描述 | 示例 |
|---|---|---|
. | 匹配任意单个字符 | a.b 匹配 acb, axb |
\d | 匹配数字 [0-9] | \d{3} 匹配 123 |
\w | 匹配字母、数字或下划线 | \w+ 匹配 abc123 |
* | 匹配 0 次或多次 | a* 匹配 ``, a, aaa |
2.3 捕获组与非捕获组
2.3.1 捕获组
捕获组用于提取匹配的子串。
-
普通捕获组:
Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})"); Matcher matcher = pattern.matcher("2024-03-28"); if (matcher.find()) {System.out.println("年份: " + matcher.group(1));System.out.println("月份: " + matcher.group(2));System.out.println("日期: " + matcher.group(3)); } -
命名捕获组:
Pattern pattern = Pattern.compile("(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})"); Matcher matcher = pattern.matcher("2024-01-01"); if (matcher.find()) {System.out.println("年份: " + matcher.group("year"));System.out.println("月份: " + matcher.group("month"));System.out.println("日期: " + matcher.group("day")); }
2.3.2 非捕获组
非捕获组匹配但不保存匹配结果。
形式为 (?:X),常用于提高匹配效率。
Pattern p = Pattern.compile("(\\d+)(?:\\.\\d*)?([¥$])");
String[] arr = {"8895¥", "8899.66¥", "6688$", "8965"};
for (String str : arr) {Matcher m = p.matcher(str);if (m.find()) {System.out.println("货币金额: " + m.group(1));System.out.println("货币种类: " + m.group(2));}
}
2.4 零宽断言
零宽断言用于匹配位置而非具体字符:
(?=X):正向预查(?<=X):反向预查(?!X):负向预查(?<!X):负向反查
示例:
String str = "abc123def";
Pattern p = Pattern.compile("\\d{3}(?=def)");
Matcher m = p.matcher(str);
if (m.find()) {System.out.println("匹配内容: " + m.group(0)); // 输出 "123"
}
2.5 常用正则表达式示例
- 验证用户名:
^[a-zA-Z]\w{5,15}$ - 验证手机号码:
^(13[0-9]|15[0-9]|18[0-9])\d{8}$ - 验证邮箱:
^[\w-]+@[\w-]+(\.[\w-]+)+$ - 验证 IP 地址:
(\d{1,3}\.){3}\d{1,3}
总结
本文系统介绍了字符编码的发展历程,从 ASCII 到 Unicode 的演变过程,并解析了常见的编码方案,如 UTF-8 和 UTF-16。通过 Java 示例展示了不同字符集的编码长度差异。在正则表达式部分,详细说明了捕获组、非捕获组及零宽断言的用法,并提供了常见验证场景的正则表达式示例。通过合理使用正则表达式,可以实现高效、灵活的字符串匹配和处理。
相关文章:
Java字符编码与正则表达式深度解析
Java字符编码与正则表达式深度解析 1. 字符编码发展 1.1 ASCII 码 在计算机最初发明时,主要用于数值计算,但随着计算需求的增加,人们发现计算机可以用来处理文本信息。因此,将字符映射为数字来表示。 字母 ‘A’ 映射为 65&am…...
【C++】B2099 矩阵交换行
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 💯题目分析💯不同解法分析我的做法实现步骤:优点:不足&#…...
论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 史丹,天津大学博士生 内容简介 大语言模型(LLM)经过海量数据训练后编码了丰富的世界知识。最近的研究表明,…...
edeg插件/扩展推荐:助力生活工作
WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:...
基于Python读取ZIP和TAR格式压缩包教程
在数据处理和文件管理中,压缩包(如ZIP、TAR等格式)的使用非常普遍。Python提供了多种库来读取和处理这些压缩包。本文将介绍如何使用Python的内置库和第三方库来读取ZIP和TAR格式的压缩包。 1、读取ZIP文件 Python的zipfile模块提供了处理Z…...
懒人不下床型遥控方案--手机对电脑的简单遥控(无收费方案)
兄弟们,天气越发寒冷,不得不说,对像我这种喜欢看直播睡觉的懒狗越发的不友好了,每次昏昏欲睡但还要下床关直播的操作就像泡完温泉直接冲凉水澡,透心凉,心飞扬。 最进也是有时间找找合适的懒人方案解决这个…...
人工智能知识分享第八天-机器学习_泰坦尼克生存预估线性回归和决策树回归对比案例
泰坦尼克生存预估案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report import matplotlib.pyplot as plt from sklearn.tree import plot_t…...
html中下拉选框的基本实现方式及JavaScript动态修改选项内容情况总结
最近项目中使用到了下拉选项以及通过js判断动态改变选项值的相关操作,查询了一些相关内容,在此记录一下,以免后续再碰到布置如何书写。 一、html中下拉选框的基本方式 在 HTML 中,创建下拉选择框(也叫选择菜单&#…...
sql server期末复习
表操作 创建create 删除drop 修改alter 数据操作 查询 select from <tableName> 插入 insert into <tableName> values 修改 update <tableName> set 删除 delete from <tableName> 授权与收回对数据的操作权限 授予 grant <权…...
LabVIEW语言学习过程是什么?
学习LabVIEW语言的过程可以分为几个阶段,每个阶段的重点内容逐步加深,帮助你从入门到精通。以下是一个简洁的学习过程: 1. 基础入门阶段 理解图形化编程:LabVIEW是一种图形化编程语言,与传统的文本编程语言不同&am…...
小程序租赁系统开发的优势与应用前景分析
内容概要 小程序租赁系统是一种新兴的数字化解决方案,旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能,如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好,让用户能够轻松选择所需的商品或服务&…...
『SQLite』安装与基本命令语法
SQLite安装 Windows: 访问 SQLite 的安装网页:https://www.sqlite.org/download.html.向下滚动页面到“Precompiled Binaries for Windows”部分。下载适用于你的系统架构(32-bit 或 64-bit)的预编译二进制文件。将下载的 ZIP 文…...
Unity-Mirror网络框架-从入门到精通之Benchmark示例
文章目录 前言什么是Benchmark?Benchmark 简要说明Benchmark示例BenchmarkNetworkManagerMonsterMovementPlayerMovementInterestManagement性能指标 BenchmarkIdle示例BenchmarkPrediction示例BenchmarkStinkySteak示例 前言 在现代游戏开发中,网络功能…...
毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
今日头条ip属地根据什么显示?不准确怎么办
在今日头条这样的社交媒体平台上,用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而,不少用户发现自己的IP属地显示与实际位置不符,这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据,并提供解决IP属…...
FPGA设计-如何使用后端工具
目录 简介 布线布局 设计前期 布局布线策略 兼谈如何做第一次布局布线 正确看待map之后的资源占用报告 简介 本章节主要说明Xilinx的一些后端工具能为我们做什么在什么情况下我们考虑使用这些工具至于这些工具具体如何使用可以看Xilinx提供的相关文件 可从www.xilinx.com…...
苍穹外卖04——Redis初入门 在店铺打烊or营业状态管理功能中的使用
Redis入门 redis简介 它以键值对的形式存储数据在内存中,并且以极高的性能和灵活性而著称,通常用于缓存、消息代理以及持久化数据。 - 基于内存存储,读写性能高- 适合存储热点数据(热点商品、资讯、新闻)- 企业应用广泛Windows版下载地址:https://github.com/microsoft…...
【MySQL关于数据库和表结构的增删查改】
数据库和表结构的基本语法 数据库命令关于字符集语法 表操作语法创建表查看表结构修改表修改表名增加字段同时修改字段名和字段数据类型仅修改字段数据类型删除字段 删除表 备份和恢复备份恢复 mysql -h 127.0.0.1 -P 3306 -u root -p mysql -u root -h 和 -p 默认 进入MySQL程…...
JVM实战—11.OOM的原因和模拟以及案例
大纲 1.线上系统突然由于OOM内存溢出挂掉 2.什么是内存溢出及哪些区域会发生内存溢出 3.Metaspace如何因类太多而发生内存溢出 4.无限制调用方法如何让线程的栈内存溢出 5.对象太多导致堆内存实在放不下而内存溢出 6.模拟JVM Metaspace内存溢出的场景(动态生成268个类占1…...
LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 教程 (4)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
