140.正则表达式
正则表达式底层实现
**介绍:**一个正则表达式,就是用某种模式去匹配字符串的一个公式
public class TestJava {
public static void main(String[] args) {
String content = "11943wd2342drwf4235";
//目标:匹配所有四个数组
//1、\\d表示一个任意的数字
String regStr = "\\d\\d\\d\\d";
String regStr2 = "(\\d\\d)(\\d\\d)";
//2.创建模式对象
Pattern pattern = Pattern.compile(regStr);
//3.创建匹配器
//说明:创建匹配器matcher,按照正则表达式的规则去匹配 content字符串
Matcher matcher = pattern.matcher(content);
//4.开始匹配
/**
*
* matcher.find() 完成的任务 (考虑分组)
* 什么是分组,比如(\d\d)(\d\d),小括号就是分组
*
* 1.根据指定的规则,定位满足条件的子字符串(比如1998)
* 2.找到后,将子字符串的开始索引记录到 matcher对象的属性 int[] groups
* 2.1 groups[0] = 0 ,把该字符串的结束的索引+1的值记录到 groups[1] = 4
* 2.2 记录1组()匹配到的字符串 groups[2] = 0 groups[3] = 2
* 2.3 记录2组()匹配到的字符串 groups[4] = 2 groups[5] = 4
* 3.同时记录oldLast 的值为 子字符串的结束的索引+1的值 即4,即下次执行find的方法时,从4开始
*
* matcher.group(0)
*
* 源码:
* public String group(int group) {
* if (first < 0)
* throw new IllegalStateException("No match found");
* if (group < 0 || group > groupCount())
* throw new IndexOutOfBoundsException("No group " + group);
* if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
* return null;
* return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
* }
* 1.根据 groups[0]=0 和 groups[1]=4 的记录的位置,从content开始截取子字符串返回
* 就是[0,4)
*/
while (matcher.find()) {
//小结
//1.如果正则表达式有() 即分组
//2.取出匹配的字符串规则如下
//3.group(0) 表示匹配到的字符串
//4.group(1) 表示匹配到的字符串的第一组字串
//4.group(2) 表示匹配到的字符串的第二组字串
System.out.println("找到:" + matcher.group(0));
System.out.println("第1组()匹配到的值=" + matcher.group(1));
System.out.println("第2组()匹配到的值=" + matcher.group(2));
}
}
}