例一:
import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main { public static void main(String[] args) { String a = "1631 年,意大利传教士萨鲁布里诺(Agostino Salumbrino)" + "从南美洲秘鲁人那里获得了一种有效治疗热病的药物——金鸡纳树皮(cinchona bark)" + "并将之带回欧洲用于热病治疗,不久人们发现该药对间歇热具有明显的缓解作用。\n" + "1820 年,法国化学家佩尔蒂埃(Pierre Joseph)和药学家卡文托(Joseph Bienaimé Caventou)" + "从金鸡纳树皮分离治疗疟疾的有效成分并将之命名为奎宁(quinine)。"; //需求:匹配所有四个连续数字 //1. \\d 表示一个任意的数字 String str = "\\d\\d\\d\\d"; //2. 创建模式对象(即正则表达式对象 Pattern pattern = Pattern.compile(str); //3. 创建匹配器 //说明:创建正则表达式matcher,按照正则表达式规则,去匹配 a字符串 Matcher matcher = pattern.matcher(a); //4. 开始匹配 /* * matcher.find()完成的任务 * 1. 根据指定的规则,定位满足规则的子字符串(比如1631) * 2. 找到后,将子字符串的开始索引记录到matcher对象的属性int[] groups; * groups[0] = 0, 把该子字符串的结束的索引+1的值记录到groups[1] = 4 * 3. 同时记录oldLast 的值为 子字符串的结束的索引 索引+1的值即4,即下次执行find时,就从4开始匹配 * * matcher.group(0)分析 * 1. 根据groups[0]和groups[1]的记录位置,从字符串a中截取子字符串返回 * 就是[0,4),索引包含0,不包含4 */ while(matcher.find()){ System.out.println("找到:" + matcher.group(0)); } }}

例二:
package test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main { public static void main(String[] args) { String a = "1631 年,意大利传教士萨鲁布里诺(Agostino Salumbrino)" + "从南美洲秘鲁人那里获得了一种有效治疗热病的药物——金鸡纳树皮(cinchona bark)" + "并将之带回欧洲用于热病治疗,不久人们发现该药对间歇热具有明显的缓解作用。\n" + "1820 年,法国化学家佩尔蒂埃(Pierre Joseph)和药学家卡文托(Joseph Bienaimé Caventou)" + "从金鸡纳树皮分离治疗疟疾的有效成分并将之命名为奎宁(quinine)。"; //需求:匹配所有四个连续数字 //1. \\d 表示一个任意的数字 String str = "(\\d\\d)(\\d\\d)"; //2. 创建模式对象(即正则表达式对象 Pattern pattern = Pattern.compile(str); //3. 创建匹配器 //说明:创建正则表达式matcher,按照正则表达式规则,去匹配 a字符串 Matcher matcher = pattern.matcher(a); //4. 开始匹配 /* * matcher.find()完成的任务(考虑分组) * 什么是分组,比如:(\d\d)(\d\d),正则表达式中有()表示分组,第一个()表示第1组,第一个()表示第2组 * 1. 根据指定的规则,定位满足规则的子字符串(比如(16)(31)) * 2. 找到后,将子字符串的开始索引记录到matcher对象的属性int[] groups; * 2.1 groups[0] = 0, 把该子字符串的结束的索引+1的值记录到groups[1] = 4 * 2.2 把第1组()匹配到的字符串 groups[2] = 0,groups[3] = 1 + 1 = 2 * 2.3 把第2组()匹配到的字符串 groups[4] = 2,groups[5] = 3 + 1 = 4 * 2.4 如果有更多的分组,依次类推………… * 3. 同时记录oldLast 的值为 子字符串的结束的索引 索引+1的值即4,即下次执行find时,就从4开始匹配 * * matcher.group(0)分析 * 1. 根据groups[0]和groups[1]的记录位置,从字符串a中截取子字符串返回 * 就是[0,4),索引包含0,不包含4 */ while(matcher.find()){ System.out.println("找到:" + matcher.group(0)); System.out.println("第一组()匹配到的值=" + matcher.group(1)); System.out.println("第二组()匹配到的值=" + matcher.group(2)); } }}
小结:
- 如果正则表达式有() 即分组
- 取出匹配的字符串的规则如下:
- group(0) 表示匹配的子字符串
- group(1) 表示匹配的子字符串的第一组子串
- group(2) 表示匹配的子字符串的第二组子串
- …………但是分组的数不能越界