Java正则表达式超详细讲解(简单易懂版)
目录
- 前言
- 一、基础概念
- 1. 什么是正则表达式?
- 2. Java中正则表达式的两个核心类:
- 二、基本语法
- 1. 普通字符
- 2. 特殊字符(元字符)
- 3. 常用元字符
- 4. 量词
- 三、Java中使用正则表达式
- 1. 简单匹配示例
- 2. 完整使用步骤
- 3. 常用方法
- 四、实际应用示例
- 1. 验证邮箱格式
- 2. 提取所有数字
- 3. 替换字符串
- 五、分组和捕获
- 六、常见问题
- 总结
前言
正则表达式是用来匹配和处理文本的强大工具。在Java中,主要通过 java.util.regex
包中的 Pattern
和 Matcher
类来实现。
一、基础概念
1. 什么是正则表达式?
正则表达式(Regular Expression)是一种用来描述字符串模式的特殊语法,可以用来:
检查字符串是否符合某种格式
从字符串中提取特定部分
替换字符串中的内容
2. Java中正则表达式的两个核心类:
Pattern
:编译后的正则表达式模式Matcher
:用模式匹配字符串的引擎
二、基本语法
1. 普通字符
普通字符(字母、数字)直接php匹配自身:
a
匹配字母"a"5
匹配数字"5"
2. 特殊字符(元字符)
这些字符有特殊含义,需要用\
转义:
. ^ $ * + ? { } [ ] \ | ( )
3. 常用元字符
字符 | 说明 | 示例 |
---|---|---|
. | 匹配任意单个字符 | a.c 匹配 "abc"、"a1c" |
\d | 数字 [0-9] | \d\d 匹配 "12"、"34python" |
\D | 非数字 [^0-9] | \D\D 匹配 "ab"、"##" |
\w | 单词字符 [a-zA-Z0-9_] | \w\w 匹配 "a1"、"B_" |
\W | 非单词字符 | \W\W 匹配 "@#"、"! " |
\s | 空白字符 [ \t\n\x0B\f\r] | a\sb 匹配 "a b" |
\S | 非空白字符 | a\Sb 匹配 "a1b" |
4. 量词
量词 | 说明 | 示例 |
---|---|---|
* | 0次或多次 | a* 匹配 ""、"a"、"aa" |
+ | 1次或多次 | a+ 匹配 "a"、"aa" |
? | 0次或1次 | a? 匹配 ""、"a" |
{n} | 恰好n次 | a{2} 匹配 "aa" |
{n,} | 至少n次 | a{2,} 匹配 "aa"、"aaa" |
{n,m} | n到m次 | a{2,4} 匹配 "aa"、"aaa"、"aaaa" |
正则表达式 | 描述 |
---|---|
this is text | 匹配字符串 "this is text" |
this\s+is\s+tejavascriptxt | 注意字符串中的 \s+。 匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。 可以匹配这个实例:this is text |
^\d+(\.\d+)? | ^ 定义了以什么开始 \d+ 匹配一个或多个数字 ? 设置括号内的选项是可选的 \. 匹配 "." 可以匹配的实例:"5", "1.5" 和 "2.21"。 |
三、Java中使用正则表达式
1. 简单匹配示例
String text = "Hello, my phone number is 123-456-7890"; String pattern = "\\d{3}-\\d{3}-\\d{4}"; // 匹配电话号码格式 boolean isMatch = text.matches(pattern); // false,因为matches要求整个字符串匹配 boolean contains = Pattern.compile(pattern).matcher(text).find(); // true
2. 完整使用步骤
// 1. 编译正则表达式 Pattern p = Pattern.compile("a*b"); // 2. 创建匹配器 Matcher m = p.matcher("aaaaab"); // 3. 进行匹配 boolean b = m.matches(); // true
3. 常用方法
方法 | 说明 |
---|---|
matches() | 整个字符串是否匹配 |
find() | 查找下一个匹配项 |
group() | 返回匹配的字符串 |
start() /end() | 匹配的起始/结束位置 |
replaceAll() | 替换所有匹配项 |
四、实际应用示例
1. 验证邮箱格式
String email = "test@example.com"; String regex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"; boolean isValid = email.matches(regex); // true
2. 提取所有数字
String text = "订单123,金额456.78元"; Pattern p = Pattern.compile("\\d+\\.?\\d*"); Matcher m = p.matcher(text); while(m.find()) { System.out.println("找到数字: " + m.group()); } // 输出: // 找到数字: 123 // 找到数字: 456.78
3. 替换字符串
String text = "2023-05-15"; String newText = text.replaceAll("(\\d{4})-(\\d{2})-(\\d{2})", "$2/$3/$1"); // 结果: "05/15/2023"
五、分组和捕获
用()
创建分组:
String text = "John Doe, age 30"; Pattern p = Pattern.compile("(\\w+) (\\w+), age (\\d+)"); Matcher m = p.matcher(text); if(m.find()) { System.out.println("姓名: " + m.group(1) + " " + m.group(2)); System.out.println("年龄: " + m.group(3)); } // 输出: // 姓名: John Doe // 年龄: 30
六、常见问题
转义问题:Java字符串中
\
需要写成\\
正则中的
\d
→ Java字符串中写成"\\d"
贪婪匹配:默认是贪婪匹配(匹配尽编程客栈可能多的字符)
在量词后加
?
改为非贪婪匹配:.*?
性能优化:
重用
Pattern
对象(编译正则表达式比较耗时)避免过度复杂的正则表达式
总结
到此这篇关于Java正则表达式的文章就介绍到这了,更多相关Java正则表达式详解内容请搜索编程客栈(wwwjs.cppcns.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论