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 示例展示了不同字符集的编码长度差异。在正则表达式部分,详细说明了捕获组、非捕获组及零宽断言的用法,并提供了常见验证场景的正则表达式示例。通过合理使用正则表达式,可以实现高效、灵活的字符串匹配和处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502381.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分享:空气质量数据--哈尔滨

说明&#xff1a;如需数据可以直接到文章最后关注获取。 1.数据背景 地理位置与气候条件&#xff1a;哈尔滨位于中国东北部&#xff0c;黑龙江省南部&#xff0c;松花江中游。由于其地理位置&#xff0c;冬季寒冷且漫长&#xff0c;夏季短促而温热。这种气候特点对空气质量…

端口镜像SPAN与RSPAN

端口镜像概述 端口镜像的作用主要在于一些难度较大的网络技术的学习中&#xff0c;我们通过抓包对报文的分析&#xff0c;可以更好地理解 还有的就是在网络排障的过程中&#xff0c;我们可以通过抓包分析数据报文的收发等状态&#xff0c;来判断在哪个设备节点上出现了问题 …

基于Web的足球青训俱乐部管理后台系统的设计与开发源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于Web的足球青训俱乐部管理后台系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基…

IDEA 撤销 merge 操作(详解)

作为一个开发者&#xff0c;我们都知道Git是一个非常重要的版本控制工具&#xff0c;尤其是在协作开发的过程中。然而&#xff0c;在使用Git的过程中难免会踩一些坑&#xff0c;今天我来给大家分享一个我曾经遇到的问题&#xff1a;在使用IDEA中进行merge操作后如何撤销错误的合…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送&#xff0c;需要注意的是发送的16进制数前面要加入0x标志。只有这样&#xff0c;realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入&#xff0c;第一个参数为字符串&#xff0c;第二个参数为发送形式&…

C++基础概念复习

前言 本篇文章作基础复习用&#xff0c;主要是在C学习中遇到的概念总结&#xff0c;后续会继续补充。如有不足&#xff0c;请前辈指出&#xff0c;万分感谢。 1、什么是封装&#xff0c;有何优点&#xff0c;在C中如何体现封装这一特性&#xff1f; 封装是面向对象编程&…

【C++】矩阵转置问题详解与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目解析&#x1f4af;第一种实现方式&#xff1a;我的初始做法实现思路优缺点分析 &#x1f4af;第二种实现方式&#xff1a;我的优化做法实现思路优缺点分析 &#x1f4a…

在线二维码生成器-GO在线工具-文本工具

一款高效、便捷的在线二维码生成工具&#xff0c;支持生成文本、链接、名片等多种类型的二维码。无需安装软件&#xff0c;快速在线生成高清二维码&#xff0c;适用于个人使用和商业推广。免费使用&#xff0c;让二维码生成变得更简单。 gotool

【微服务】2、网关

Spring Cloud微服务网关技术介绍 单体项目拆分微服务后的问题 服务地址问题&#xff1a;单体项目端口固定&#xff08;如黑马商城为8080&#xff09;&#xff0c;拆分微服务后端口各异&#xff08;如购物车808、商品8081、支付8086等&#xff09;且可能变化&#xff0c;前端难…

SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)

文章目录 目录了解自动配置 一、导入对应场景的Mean依赖&#xff1a;1、引入依赖**找到自动配置类的所有配置都存放在哪里** 二、编写主程序&#xff1a;SpringBootApplication观察源码时所需要知道的几个核心注解&#xff1a;1、观察SpringBootApplication源码都做了什么 三、…

图像分割基础:使用Python和scikit-image库

大家好&#xff0c;今天我们将一起探讨图像分割的基础知识&#xff0c;并使用Python编程语言以及scikit-image库来实现一个简单的图像分割示例。图像分割是图像处理中的一项重要技术&#xff0c;它允许我们将图像划分为多个部分或对象&#xff0c;这对于图像分析和计算机视觉任…

SpringBoot中实现拦截器和过滤器

【SpringBoot中实现过滤器和拦截器】 1.过滤器和拦截器简述 过滤器Filter和拦截器Interceptor&#xff0c;在功能方面很类似&#xff0c;但在具体实现方面差距还是比较大的。 2.过滤器的配置 2.1 自定义过滤器&#xff0c;实现Filter接口(SpringBoot 3.0 开始&#xff0c;jak…

基于LightGBM的集成学习算法

目录 一、LightGBM基本原理1.1 基于直方图的决策树算法1.1.1 连续变量分箱 1.2 互斥特征捆绑1.2.1 互斥特征捆绑计算流程1.2.2 互斥特征捆绑算法基本原理1.2.2.1 冲突比例&#xff08;conflict_rate&#xff09;1.2.2.2 图着色1.2.2.3 特征捆绑 1.3 基于梯度的单边采样&#xf…

trendFinder - 利用 AI 掌握社交媒体上的热门话题

1600 Stars 177 Forks 7 Issues 2 贡献者 MIT License Javascript 语言 代码: https://github.com/ericciarla/trendFinder 更多AI开源软件&#xff1a;AI开源 - 小众AI Trend Finder 收集并分析来自关键影响者的帖子&#xff0c;然后在检测到新趋势或产品发布时发送 Slack 通知…

Level DB --- BloomFilterPolicy

BloomFilterPolicy是Level DB中重要的数据过滤模块&#xff0c;它主要用来先过滤在Block中不存在的key&#xff0c;减少Block的搜索计算量。 Bloom Filter 从原理上来讲Bloom FIlter相对来说原理还是比较简单的&#xff0c;将一个key经过一次&#xff08;组合&#xff09;ha…

ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana

前言 你知道对于一个系统的上线考察&#xff0c;必备的几样东西是什么吗&#xff1f;其实这也是面试中考察求职者&#xff0c;是否真的做过系统开发和上线的必备问题。包括&#xff1a;服务治理(熔断/限流) (opens new window)、监控 (opens new window)和日志&#xff0c;如果…

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…

机器学习周报-ModernTCN文献阅读

文章目录 摘要Abstract 0 提升有效感受野&#xff08;ERF&#xff09;1 相关知识1.1 标准卷积1.2 深度分离卷积&#xff08;Depthwise Convolution&#xff0c;DWConv&#xff09;1.3 逐点卷积&#xff08;Pointwise Convolution&#xff0c;PWConv&#xff09;1.4 组卷积(Grou…

计算机的错误计算(二百零二)

摘要 利用三个大模型化简计算 前面分式的分子为零&#xff0c;因此正确值是后面的数值300.09...321 . 让三个大模型计算&#xff0c;它们均没有看出分式的分子中被减数与减数是相等的。因此&#xff0c;均得出了错误结果。 例1. 化简计算摘要中算式的值。 下面是一个大模型的…

2025-01-04 Unity插件 YodaSheet1 —— 插件介绍

文章目录 1 介绍2 工作原理2.1 ScriptableObject -> YadeSheetData2.2 YadeDatabase 存储多个 YadeSheetData 3 用途4 缺点5 推荐 1 介绍 ​ Yade 提供类似于 Excel 或者 Google Sheets 的表格编辑器&#xff0c;可以轻松地在 Unity 编辑器中 编辑&#xff0c;搜索&#xf…