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 | | | 或运算 | cat|dog |
详细说明和示例
1. 转义符\(最高优先级)
string regex = "a\\.b"; // 匹配 "a.b",而不是 "a" + 任意字符 + "b"
2. 分组和断言
// 捕获分组 string regex1 = "(ab)+"; // 匹配 "ab", "abab", "ababab" 等 // 非捕获分组 string regex2 = "(?:ab)+"; // 匹配但不捕获 // 正向先行断言 string regex3 = "a(?=b)"; // 匹配后面跟着b的a // 负向先行断言 string regex4 = "a(?!b)"; // 匹配后面不跟b的a
3. 量词
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. 字符序列 (隐式连接)
string regex = "abc"; // 匹配 "abc",优先级高于 |
5. 锚点
string regex1 = "^abc"; // 匹配以abc开头的字符串 string regex2 = "abc$"; // 匹配以abc结尾的字符串 string regex3 = "\\bword\\b"; // 匹配完整的单词"word"
6. 或运算|(最低优先级)
string regex = "cat|dog"; // 匹配 "cat" 或 "dog"
优先级验证示例
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
}
}常见优先级陷阱
// 陷阱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
理解这些优先级规则对于编写正确的正则表达式至关重要,特别是当表达式包含多个操作符时。
到此这篇关于java 正则表达式 所有的优先级的文章就介绍到这了,更多相关java正则表达式优先级内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论