## Java专题七:正则表达式
[TOC]
### 7.1.String类中的正则方法
```
// java.lang.String
public String[] split(String regex) {
return split(regex, 0);
}
public String[] split(String regex, int limit) {
// ...
return Pattern.compile(regex).split(this, limit);
}
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
public String replaceFirst(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
}
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
```
### 7.2.Pattern类与Matcher类
- input:输入字符串
- regex:正则表达式
- pattern:编译后的正则表达式
首先通过Pattern的静态方法`public static Pattern compile(String regex)`将regex进行编译成pattern,然后通过Matcher的`Matcher matcher(CharSequence input)`构造Matcher对象,调用Matcher对象的一些方法能实现对字符串的搜索、查找、替换。
**Pattern方法**:
| 方法 | 说明 |
| ------------ | ------------ |
| public static Pattern compile(String regex) | 编译regex成pattern |
| public static Pattern compile(String regex, int flags) | 编译regex成pattern,并携带参数 |
| public String[] split(String regex) | 使用pattern分割输入字符串input |
| public String[] split(CharSequence input, int limit) | 使用pattern分割输入字符串input,参数详细见下面limit说明 |
| public Matcher matcher(CharSequence input) | 构造一个Matcher对象 |
- **Pattern#compile**方法flags说明:
| 语句 | 解释及内嵌语法 |
| --- | --- |
| Pattern.UNIX_LINES| -|
| Pattern.CASE_INSENSITIVE | 不区分大小写|
| Pattern.COMMENTS| 以#开头到行尾的字符被忽略|
| Pattern.MULTILINE| 匹配多行|
| Pattern.LITERAL| 不进行转义字符转义 |
| Pattern.DOTALL| 匹配任意字符,包括换行符 |
| Pattern.UNICODE_CASE| - |
| Pattern.CANON_EQ| - |
- **Pattern#split**方法limit说明:
假设input按照pattern能分成n份,如果limit=0,则分割成n份,如果limit < n,则分成limit份,如过limit > n, 则分成n份,具体如下:
String input = "1123435345@qq.com";
| 语句 | 结果 |
| ------------ | ------------ |
| input.split("3") | [112, 4, 5, 45@qq.com] |
| input.split("3", 1) | [1123435345@qq.com]|
| input.split("3", 2) | [112, 435345@qq.com]|
| input.split("3", 5) | [112, 4, 5, 45@qq.com] |
**Matcher方法**:
| 方法 | 说明 |
| ------------ | ------------ |
| public boolean matches() | 判断pattern是否完全匹配input所有字符,匹配返回true |
| public String replaceAll(String replacement) | 替换所有input中匹配到pattern的字符串 |
| public String replaceFirst(String replacement) | 替换input中第一次匹配到pattern的字符串 |
**Pattern与Matcher结合使用方法**:
```
public class RegTest {
public static void main(String[] args) {
String source = "1123435345@qq.com";
Pattern pattern = Pattern.compile("^([\\d]+)@(.+?[.].+)$");
Matcher matcher = pattern.matcher(source);
while ( matcher.find() ) {
String email = matcher.group(0);
String account = matcher.group(1);
String domain = matcher.group(2);
System.out.println(email);
System.out.println(account);
System.out.println(domain);
System.out.println(matcher.group(3));
}
}
}
```
输出结果如下:
```
1123435345@qq.com
1123435345
qq.com
Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.group(Matcher.java:538)
at java0.RegTest.main(RegTest.java:19)
```
### 7.3.常见[正则表达式](http://www.regular-expressions.info/)语法
<table>
<tr>
<td>类型</td>
<td>字符</td>
<td>解释</td>
</tr>
<tr>
<td bgcolor=#ffc7ce>bound</td>
<td bgcolor=#ffc7ce>^</td>
<td bgcolor=#ffc7ce>匹配字符串开始标志</td>
</tr>
<tr>
<td bgcolor=#ffc7ce>bound</td>
<td bgcolor=#ffc7ce>$</td>
<td bgcolor=#ffc7ce>匹配字符串结尾标志</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce>. </td>
<td bgcolor=#c6efce>匹配任一字符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce>x|y </td>
<td bgcolor=#c6efce>匹配x字符或y字符,通常使用为(x|y)</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> [xyz] </td>
<td bgcolor=#c6efce>匹配xyz中的任一字符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> [^xyz] </td>
<td bgcolor=#c6efce>匹配不包含xyz中的任一字符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> [a-z] </td>
<td bgcolor=#c6efce> 匹配(a,z)范围内的任一字符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce>[^a-z] </td>
<td bgcolor=#c6efce> 匹配不在(a,z)范围内的任一字符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> \d </td>
<td bgcolor=#c6efce> 匹配数字字符,相当于[0-9]</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> \D </td>
<td bgcolor=#c6efce> 匹配非数字字符,相当于[^0-9]</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> \t </td>
<td bgcolor=#c6efce> 匹配制表符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> \s </td>
<td bgcolor=#c6efce> 匹配空白字符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> \S </td>
<td bgcolor=#c6efce> 匹配非空白字符</td>
</tr>
<tr>
<td bgcolor=#c6efce>char</td>
<td bgcolor=#c6efce> \n </td>
<td bgcolor=#c6efce> 匹配换行符</td>
</tr>
<tr>
<td bgcolor=#ffeb9c>times</td>
<td bgcolor=#ffeb9c> * </td>
<td bgcolor=#ffeb9c> 匹配零次或多次字符或字符串组合</td>
</tr>
<tr>
<td bgcolor=#ffeb9c>times</td>
<td bgcolor=#ffeb9c> ? </td>
<td bgcolor=#ffeb9c> 匹配零次或一次字符或字符串组合</td>
</tr>
<tr>
<td bgcolor=#ffeb9c>times</td>
<td bgcolor=#ffeb9c> + </td>
<td bgcolor=#ffeb9c> 匹配零次或多次字符或字符串组合</td>
</tr>
<tr>
<td bgcolor=#ffeb9c>times</td>
<td bgcolor=#ffeb9c> {m} </td>
<td bgcolor=#ffeb9c> 匹配m次字符或字符串组合</td>
</tr>
<tr>
<td bgcolor=#ffeb9c>times</td>
<td bgcolor=#ffeb9c> {m,} </td>
<td bgcolor=#ffeb9c> 匹配至少m次字符或字符串组合</td>
</tr>
<tr>
<td bgcolor=#ffeb9c>times</td>
<td bgcolor=#ffeb9c> {m,n} </td>
<td bgcolor=#ffeb9c> 匹配至少m次,至多n次字符或字符串组合</td>
</tr>
<tr>
<td bgcolor=#00b0f0>advanced</td>
<td bgcolor=#00b0f0> ? </td>
<td bgcolor=#00b0f0> 紧跟在类型为times的后面,如+?,为非贪心的,匹配尽可能短的字符或字符串组合</td>
</tr>
<tr>
<td bgcolor=#00b0f0>advanced</td>
<td bgcolor=#00b0f0> (pattern) </td>
<td bgcolor=#00b0f0> 匹配pattern并捕获组,能通过group查找子表达式</td>
</tr>
<tr>
<td bgcolor=#00b0f0>advanced</td>
<td bgcolor=#00b0f0> (?:pattern) </td>
<td bgcolor=#00b0f0> 匹配pattern但不捕获组</td>
</tr>
</table>
- JavaCook
- Java专题零:类的继承
- Java专题一:数据类型
- Java专题二:相等与比较
- Java专题三:集合
- Java专题四:异常
- Java专题五:遍历与迭代
- Java专题六:运算符
- Java专题七:正则表达式
- Java专题八:泛型
- Java专题九:反射
- Java专题九(1):反射
- Java专题九(2):动态代理
- Java专题十:日期与时间
- Java专题十一:IO与NIO
- Java专题十一(1):IO
- Java专题十一(2):NIO
- Java专题十二:网络
- Java专题十三:并发编程
- Java专题十三(1):线程与线程池
- Java专题十三(2):线程安全与同步
- Java专题十三(3):内存模型、volatile、ThreadLocal
- Java专题十四:JDBC
- Java专题十五:日志
- Java专题十六:定时任务
- Java专题十七:JavaMail
- Java专题十八:注解
- Java专题十九:浅拷贝与深拷贝
- Java专题二十:设计模式
- Java专题二十一:序列化与反序列化
- 附加专题一:MySQL
- MySQL专题零:简介
- MySQL专题一:安装与连接
- MySQL专题二:DDL与DML语法
- MySQL专题三:工作原理
- MySQL专题四:InnoDB存储引擎
- MySQL专题五:sql优化
- MySQL专题六:数据类型
- 附加专题二:Mybatis
- Mybatis专题零:简介
- Mybatis专题一:配置文件
- Mybatis专题二:映射文件
- Mybatis专题三:动态SQL
- Mybatis专题四:源码解析
- 附加专题三:Web编程
- Web专题零:HTTP协议
- Web专题一:Servlet
- Web专题二:Cookie与Session
- 附加专题四:Redis
- Redis专题一:数据类型
- Redis专题二:事务
- Redis专题三:key的过期
- Redis专题四:消息队列
- Redis专题五:持久化