java 正则表达式 所有的优先级

Java正则表达式的优先级从高到低如下:

正则表达式运算符优先级表

优先级 运算符 描述 示例
1 \ 转义符 \\. 匹配点号
2 (), (?:), (?=), (?!) 分组和断言 (abc), (?:abc), a(?=b)
3 *, +, ?, {n}, {n,}, {n,m} 量词 a+, b{3}, c{2,5}
4 字符序列 字符连接 abc 表示 a 后跟 b 后跟 c
5 ^, $, \b, \B 锚点 ^start, end$
6 ` ` 或运算

详细说明和示例

1. 转义符 \ (最高优先级)

java 复制代码
String regex = "a\\.b";  // 匹配 "a.b",而不是 "a" + 任意字符 + "b"

2. 分组和断言

java 复制代码
// 捕获分组
String regex1 = "(ab)+";     // 匹配 "ab", "abab", "ababab" 等

// 非捕获分组  
String regex2 = "(?:ab)+";   // 匹配但不捕获

// 正向先行断言
String regex3 = "a(?=b)";    // 匹配后面跟着b的a

// 负向先行断言
String regex4 = "a(?!b)";    // 匹配后面不跟b的a

3. 量词

java 复制代码
String regex1 = "ab?c";      // 匹配 "ac" 或 "abc" (b出现0或1次)
String regex2 = "a+b";       // 匹配 "ab", "aab", "aaab" 等 (a出现1次以上)
String regex3 = "a*b";       // 匹配 "b", "ab", "aab" 等 (a出现0次以上)
String regex4 = "a{2,4}";    // 匹配 "aa", "aaa", "aaaa"

4. 字符序列 (隐式连接)

java 复制代码
String regex = "abc";        // 匹配 "abc",优先级高于 |

5. 锚点

java 复制代码
String regex1 = "^abc";      // 匹配以abc开头的字符串
String regex2 = "abc$";      // 匹配以abc结尾的字符串
String regex3 = "\\bword\\b"; // 匹配完整的单词"word"

6. 或运算 | (最低优先级)

java 复制代码
String regex = "cat|dog";    // 匹配 "cat" 或 "dog"

优先级验证示例

java 复制代码
public class RegexPrecedence {
    public static void main(String[] args) {
        // 示例1:量词优先于 |
        String regex1 = "ab|cd+";    // 解析为: "ab" 或 "c" + "d"的一次或多次
        System.out.println("ab|cd+ 匹配:");
        System.out.println("ab: " + "ab".matches(regex1));    // true
        System.out.println("cd: " + "cd".matches(regex1));    // true  
        System.out.println("cdd: " + "cdd".matches(regex1));  // true
        System.out.println("abc: " + "abc".matches(regex1));  // false
        
        // 示例2:分组改变优先级
        String regex2 = "(ab|cd)+";  // 解析为: "ab"或"cd"的一次或多次
        System.out.println("\n(ab|cd)+ 匹配:");
        System.out.println("ab: " + "ab".matches(regex2));    // true
        System.out.println("abcd: " + "abcd".matches(regex2)); // true
        System.out.println("abab: " + "abab".matches(regex2)); // true
        
        // 示例3:字符连接优先于 |
        String regex3 = "^ab|cd$";   // 解析为: (以ab开头) 或 (以cd结尾)
        System.out.println("\n^ab|cd$ 匹配:");
        System.out.println("abc: " + "abc".matches(regex3));  // true
        System.out.println("xcd: " + "xcd".matches(regex3));  // true
        System.out.println("abcd: " + "abcd".matches(regex3)); // true
    }
}

常见优先级陷阱

java 复制代码
// 陷阱1:量词的作用范围
String trap1 = "ab+";    // 匹配 "ab", "abb", "abbb" (只对b量化)
String correct1 = "(ab)+"; // 匹配 "ab", "abab", "ababab" (对ab组量化)

// 陷阱2:| 的范围
String trap2 = "^ab|cd$";    // (^ab) 或 (cd$)
String correct2 = "^(ab|cd)$"; // 以ab或cd开头和结尾

// 陷阱3:断言的范围  
String trap3 = "a(?=b|c)d";  // a后面跟着b或c,然后是d
String correct3 = "a(?=b|cd)e"; // a后面跟着b或cd,然后是e

理解这些优先级规则对于编写正确的正则表达式至关重要,特别是当表达式包含多个操作符时。

相关推荐
JQLvopkk9 分钟前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
忧郁的Mr.Li17 分钟前
SpringBoot中实现多数据源配置
java·spring boot·后端
玄同76523 分钟前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy878747525 分钟前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-194329 分钟前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq19820430115630 分钟前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class31 分钟前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人33 分钟前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs33 分钟前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&34 分钟前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin