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

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 标准与国家标准

ANSIISO 制定了字符集标准:

  • 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 码 在计算机最初发明时&#xff0c;主要用于数值计算&#xff0c;但随着计算需求的增加&#xff0c;人们发现计算机可以用来处理文本信息。因此&#xff0c;将字符映射为数字来表示。 字母 ‘A’ 映射为 65&am…...

【C++】B2099 矩阵交换行

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 &#x1f4af;题目分析&#x1f4af;不同解法分析我的做法实现步骤&#xff1a;优点&#xff1a;不足&#…...

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 史丹&#xff0c;天津大学博士生 内容简介 大语言模型&#xff08;LLM&#xff09;经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…...

edeg插件/扩展推荐:助力生活工作

WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:...

基于Python读取ZIP和TAR格式压缩包教程

在数据处理和文件管理中&#xff0c;压缩包&#xff08;如ZIP、TAR等格式&#xff09;的使用非常普遍。Python提供了多种库来读取和处理这些压缩包。本文将介绍如何使用Python的内置库和第三方库来读取ZIP和TAR格式的压缩包。 1、读取ZIP文件 Python的zipfile模块提供了处理Z…...

懒人不下床型遥控方案--手机对电脑的简单遥控(无收费方案)

兄弟们&#xff0c;天气越发寒冷&#xff0c;不得不说&#xff0c;对像我这种喜欢看直播睡觉的懒狗越发的不友好了&#xff0c;每次昏昏欲睡但还要下床关直播的操作就像泡完温泉直接冲凉水澡&#xff0c;透心凉&#xff0c;心飞扬。 最进也是有时间找找合适的懒人方案解决这个…...

人工智能知识分享第八天-机器学习_泰坦尼克生存预估线性回归和决策树回归对比案例

泰坦尼克生存预估案例 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判断动态改变选项值的相关操作&#xff0c;查询了一些相关内容&#xff0c;在此记录一下&#xff0c;以免后续再碰到布置如何书写。 一、html中下拉选框的基本方式 在 HTML 中&#xff0c;创建下拉选择框&#xff08;也叫选择菜单&#…...

sql server期末复习

表操作 创建create 删除drop 修改alter 数据操作 查询 select from <tableName> 插入 insert into <tableName> values 修改 update <tableName> set 删除 delete from <tableName> 授权与收回对数据的操作权限 授予 grant <权…...

LabVIEW语言学习过程是什么?

学习LabVIEW语言的过程可以分为几个阶段&#xff0c;每个阶段的重点内容逐步加深&#xff0c;帮助你从入门到精通。以下是一个简洁的学习过程&#xff1a; ​ 1. 基础入门阶段 理解图形化编程&#xff1a;LabVIEW是一种图形化编程语言&#xff0c;与传统的文本编程语言不同&am…...

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案&#xff0c;旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能&#xff0c;如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好&#xff0c;让用户能够轻松选择所需的商品或服务&…...

『SQLite』安装与基本命令语法

SQLite安装 Windows&#xff1a; 访问 SQLite 的安装网页&#xff1a;https://www.sqlite.org/download.html.向下滚动页面到“Precompiled Binaries for Windows”部分。下载适用于你的系统架构&#xff08;32-bit 或 64-bit&#xff09;的预编译二进制文件。将下载的 ZIP 文…...

Unity-Mirror网络框架-从入门到精通之Benchmark示例

文章目录 前言什么是Benchmark&#xff1f;Benchmark 简要说明Benchmark示例BenchmarkNetworkManagerMonsterMovementPlayerMovementInterestManagement性能指标 BenchmarkIdle示例BenchmarkPrediction示例BenchmarkStinkySteak示例 前言 在现代游戏开发中&#xff0c;网络功能…...

毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

今日头条ip属地根据什么显示?不准确怎么办

在今日头条这样的社交媒体平台上&#xff0c;用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而&#xff0c;不少用户发现自己的IP属地显示与实际位置不符&#xff0c;这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据&#xff0c;并提供解决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 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...