查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
正则表达式类似Windows下的通配符*和?。只不过比起通配符,它能更精确地描述你的需求
简言之, 正则表达式是用于进行文本匹配的工具,也是一个匹配的表达式。


正则表达式看API中的:java.util.regex包中Pattern类和Matcher类

Pattern:Java中专门进行正则表达式编译的类。(一个该类的实例即代表正则表达式本身)

Matcher:通过解释Pattern,对字符序列执行匹配操作的引擎。(用来判断是否匹配的)

先看几种常用匹配(具体可以到API中看到很多的匹配规则):
1.内容
.  匹配除换行符以外的任意字符
\w  匹配字母或数字或下划线(\W 匹配其它字符)
\s  匹配任意的空白符
\d  匹配数字
\b  匹配单词的开始或结束
^   匹配字符串的开始
$   匹配字符串的结束
2.次数
*   重复零次或更多次
+   重复一次或更多次
?   重复零次或一次
{n} 重复n次
{n,m}重复n到m次
[ ] 中括号表示可选

下面看例子

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

public class Regex1 {

@Test
//string.matches(regex)
public void test1(){
String string = "011-123456";
//匹配规则:第一个是0,然后是两个数,一个减号,六个数字
boolean matches = string.matches("0\\d{2}-\\d{6}");
System.out.println(matches);//true

string = "011-123456789";
matches = string.matches("0\\d{2}-\\d{6}");
System.out.println(matches);//完全匹配,false

string = "老干爹";
//匹配规则:老后面可以有0个到多个字符
matches = string .matches("老.*");
System.out.println(matches);//true
}

@Test
public void test2(){
String string = "011-123456";
//Pattern: Java中专门进行正则表达式编译的类
Pattern pt = Pattern.compile("0\\d{2}-\\d{6}");
//Matcher: 通过解释Pattern,对字符序列执行匹配操作的引擎
Matcher mc = pt.matcher(string);
System.out.println(mc.find());//true

string = "011-123456789";
mc = pt.matcher(string);
System.out.println(mc.find());//true
//这里的匹配跟String里的匹配是不一样的,String是完全匹配
//而这里,Pattern,Matcher是部分匹配,找到就算匹配
}
@Test
public void test3(){
String string = "1-1112-2223-3334-4445-555";
Pattern pt = Pattern.compile("\\d-\\d{3}",Pattern.MULTILINE);//可跨行匹配
Matcher mc = pt.matcher(string);
String res = "";
while(mc.find()){//find相当于一个游标
res = mc.group();
System.out.println(res);
}
//也可以指定位置
System.out.println("***********");
mc.find(2);
res = mc.group();
System.out.println(res);
/*
输出:
1-111
2-222
3-333
4-444
5-555
***********
2-222
*/
}
}