正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
接下来就进行测试:
(1)、对字符串[email protected]@[email protected] hadvjk进行匹配。
matches() 是对整个字符串去判断。
find() 是一个一个字符的去匹配,出现符合的就返回true
其中,reset() 是对find()方法中 匹配器中的指针重置回到字符串的第0位
package cn.liu.regularexpresssion;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo01 {
public static void main(String[] args) {
String str = "[email protected]@[email protected] hadvjk";
//表达式对象
Pattern p = Pattern.compile("\\w+");
//创建Matcher对象
Matcher m = p.matcher(str);
//匹配的整个字符序列
boolean oo = m.matches();//整个字符串不符合要求
System.out.println(oo);
m.reset();//重置匹配器
//一个一个的去匹配查看字符串是否有符合
boolean aa = m.find();
String str1 = m.group();
System.out.println(aa+"---->"+str1);
boolean bb = m.find();//此时find() 匹配器指针走到第一个@
System.out.println(bb+"---->"+m.group());
System.out.println("-------------------");
//循环输出所有符合规则的字符串
m.reset();//重置匹配器
while(m.find()) {
System.out.println(m.group());
}
}
}
(2)来看一看group()函数
其中正则表达式:([0-9][a-z]+)(@) 是匹配 第一位是数字,后面有若干的字母,最后一位是@的字符串形式。
首先:m.group()和m.group(0)是等价的。
其次:m.group()是第一次m.find()所匹配的内容,m.group(1)是m.group()所符合表达式([0-9][a-z]+)的内容;m.group()是m.group()符合表达式(@)的内容。m.group()则出现错,因为没有第三部分表达式。
package cn.liu.regularexpresssion;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo02 {
public static void main(String[] args) {
String str = "[email protected]@jnb_j22jj";
Pattern p = Pattern.compile("([0-9][a-z]+)(@)");
Matcher m = p.matcher(str);
while(m.find()) {
System.out.print(m.group()+",");
}
System.out.println();
m.reset();
m.find();
System.out.print(m.group()+",");
System.out.print(m.group(0)+",");
System.out.print(m.group(1)+",");
System.out.print(m.group(2)+",");
}
}
(3)、替换
package cn.liu.regularexpresssion;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo03 {
public static void main(String[] args) {
//表达式对象
Pattern p = Pattern.compile("\\w+");
//创建Matcher对象
Matcher m = p.matcher("[email protected]@[email protected] hadvjk");
//替换
System.out.println(m.replaceAll("#"));
}
}
(4)、切割
package cn.liu.regularexpresssion;
import java.util.Arrays;
public class Demo04 {
public static void main(String[] args) {
String str = "[email protected]@[email protected] hadvjk";
String[] arr1 = str.split("@");//按@切割
String[] arr2 = str.split("\\w+");//按若干个字母切割
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
}
}
如果对正则表达式规则不熟悉,可以看看其规则:
https://blog.csdn.net/qq_40301026/article/details/89042294