Java正则表达式深度解析:元字符与量词的组合艺术

1. 正则表达式概述

正则表达式(Regular Expression)是处理字符串的强大工具,Java通过java.util.regex包提供完整的正则支持。正则表达式由普通字符和特殊字符(元字符)组成,形成一种描述字符串模式的"迷你语言"。

1.1 正则表达式的基本组成

String regex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("example@email.com");
boolean isMatch = matcher.matches(); // true

2. 常用元字符详解

2.1 基础元字符

元字符 名称 功能 示例 匹配示例
. 点号 匹配任意单个字符 a.c “abc”, “a1c”
^ 脱字符 匹配行首 ^Java “Java编程"中的"Java”
$ 美元符 匹配行尾 end$ “The end"中的"end”
\d 数字 匹配数字字符 \d\d “12”, “45”
\w 单词字符 匹配字母数字下划线 \w+ “hello”, “A1_”
\s 空白符 匹配空白字符 a\sb “a b”

2.2 字符类元字符

// 匹配十六进制颜色代码
String colorRegex = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
表达式 含义 等价写法
[abc] 匹配a、b或c `(a
[^abc] 匹配非a、b、c的字符 -
[a-z] 匹配a到z的小写字母 -
[a-zA-Z] 匹配所有字母 -

3. 量词系统解析

3.1 基本量词

量词 含义 示例 匹配示例
* 0次或多次 a*b “b”, “aab”
+ 1次或多次 a+b “ab”, “aaab”
? 0次或1次 a?b “b”, “ab”
{n} 恰好n次 a{2}b “aab”
{n,} 至少n次 a{2,}b “aab”, “aaaab”
{n,m} n到m次 a{2,4}b “aab”, “aaaab”

3.2 贪婪/勉强/独占量词对比

String text = "aaaab";
Pattern.compile("a+b").matcher(text).find();   // 贪婪模式:匹配"aaaab"
Pattern.compile("a+?b").matcher(text).find(); // 勉强模式:匹配"aaab"
Pattern.compile("a++b").matcher(text).find(); // 独占模式:不匹配
量词类型 符号 匹配策略 回溯机制
贪婪 *, +, ? 尽可能多匹配 会回溯
勉强 *?, +?, ?? 尽可能少匹配 会回溯
独占 *+, ++, ?+ 尽可能多匹配 不回溯

4. 分组与捕获

4.1 分组类型

// 电话号码匹配
String phoneRegex = "^(\\+\\d{1,3})?[-.\\s]?((\\d{3})[-.\\s]?){2}\\d{4}$";
分组类型 语法 特点 示例
捕获分组 (pattern) 捕获匹配内容 (\\d{3})
非捕获分组 (?:pattern) 不捕获仅分组 (?:\\d{3}-){2}
命名分组 (?<name>pattern) 可命名引用 (?<area>\\d{3})

4.2 分组引用

// 匹配重复单词
String duplicateRegex = "\\b(\\w+)\\b\\s+\\1\\b";
Pattern.compile(duplicateRegex, Pattern.CASE_INSENSITIVE)
    .matcher("hello hello world").find(); // true

5. 零宽断言

5.1 断言类型对比

<
断言类型 语法 含义 示例
正向先行 (?=pattern) 后面必须跟着pattern \\w+(?=;)
负向先行 (?!pattern) 后面不能跟着pattern \\d{3}(?!\\d)
正向后行 (?<=pattern) 前面必须是pattern (?<=\\$)\\d+
负向后行 (?<!pattern)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻南瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值