张家港网站推广优化,上海软件开发外包,软件源码购买一般在哪个网站,网站名称是否已被注册Java字符编码与正则表达式深度解析
1. 字符编码发展
1.1 ASCII 码
在计算机最初发明时#xff0c;主要用于数值计算#xff0c;但随着计算需求的增加#xff0c;人们发现计算机可以用来处理文本信息。因此#xff0c;将字符映射为数字来表示。
字母 ‘A’ 映射为 65主要用于数值计算但随着计算需求的增加人们发现计算机可以用来处理文本信息。因此将字符映射为数字来表示。
字母 ‘A’ 映射为 65字母 ‘B’ 映射为 66。这种字符与数字的映射关系被称为ASCII字符集。
ASCII 范围
控制字符031 和 127如换行LF、回车CR。可显示字符32126如数字 09、字母 A-Z 和 a-z以及标点符号。
示例
字符 A 编码为十进制65二进制010000011.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可变长度编码使用 14 个字节表示字符。UTF-16定长编码每次 16 位。
示例将 中 (U4E2D) 编码为 UTF-8
Unicode01001110 00101101UTF-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 示例展示了不同字符集的编码长度差异。在正则表达式部分详细说明了捕获组、非捕获组及零宽断言的用法并提供了常见验证场景的正则表达式示例。通过合理使用正则表达式可以实现高效、灵活的字符串匹配和处理。