正则表达式
正则表达式是对字符串执行模式匹配的技术。
正则表达式匹配流程
private void RegTheory() {
// 正则表达式
String content = "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2) " +
"的3个版本: J2ME (Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境: J2SE (Java " +
"Standard Edition,Java 2平台的标准版),应用于桌面环境:2EE (Java 2Enterprise Edition,Java " +
"2平台的企业版) ,应用3443于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及9889";
// 目标 匹配所有数组的字符串
// 1、 \\d表示一个任意的数字
String regStr = "\\d\\d\\d\\d";
// 2、创建模式对象
Pattern pattern = Pattern.compile(regStr);
// 3、创建匹配器
// 说明,创建匹配器,按照正则表达式的规则去匹配
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
Log.i(TAG,"找到:" + matcher.group(0));
}
}
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:1998
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:1999
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:3443
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:9889
private void RegTheory() {
// 正则表达式
String content = "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2) " +
"的3个版本: J2ME (Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境: J2SE (Java " +
"Standard Edition,Java 2平台的标准版),应用于桌面环境:2EE (Java 2Enterprise Edition,Java " +
"2平台的企业版) ,应用3443于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及9889";
// 目标 匹配所有数组的字符串
// 1、 \\d表示一个任意的数字
String regStr = "(\\d\\d)(\\d\\d)";
// 2、创建模式对象
Pattern pattern = Pattern.compile(regStr);
// 3、创建匹配器
// 说明,创建匹配器,按照正则表达式的规则去匹配
Matcher matcher = pattern.matcher(content);
/**
* matcher.find()
* 1、根据指定的规则,定位满足规则的子字符串(比如1998)
* 2、找到后,将 子字符串的开始的索引记录到 matcher对象的属性 int[] groups[0] = 0
* 把该子字符串的结束的索引+1的值记录到 groups[1] = 4
*
* 3、如果再次指向 find方法。仍然安上面分析来执行
*
* 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
* 2.4 如果有更多的分组,依次类推
*
* 3、如果再次指向 find方法。仍然安上面分析来执行
*/
while (matcher.find()){
Log.i(TAG,"找到:" + matcher.group(0));
}
}
正则表达式语法
如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
1、限定符
2、选择匹配符
3、分组组合和反向引用符
4、特殊字符
5、字符匹配符
6、定位符
转义符说明
元字符(Metacharacter)-转义号 \\
符号说明:
在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。
案例: 用("
用( 去匹配 “abc$(”会怎样 ?
private void RegTest2() {
String content ="abc$(abc(1.23(";
//匹配(
// String regStr = "\\(";
String regStr = "\\.";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
Log.i(TAG,"match:" + matcher.group(0));
}
}
元字符-字符匹配符
更正:\\w 匹配单个数字、大小写字母字符以及下划线_ 相当于[0-9a-zA-Z_]
?表示0或者1
{3}表示三个数字
+代表1到多个
\\s 匹配任何空白字符(空格,制表符等
\\S 匹配任何非空字符
. 匹配出\n 之外的所有字符,如果要匹配。本身则需要使用\\.。
限定符
private void regSMatching(){
String content = "1111222 z_*@ hello jj 曙光";
String regStr = "\\d{3,4}"; // 匹配任何非空字符
Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
Log.i(TAG,"matcher:" + matcher.group(0));
}
}
java匹配时贪婪匹配,默认匹配多的。
2023-08-16 20:45:38.948 9275-10989/cn.jj.reg I/JJWorld.MainActivity: matcher:1111
2023-08-16 20:45:38.948 9275-10989/cn.jj.reg I/JJWorld.MainActivity: matcher:222
不区分大小写
修改字符串
(?i) 表示不区分大小写 示例:String regStr = “(?i)abc”;
修改生成Pattern规则
Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
定位符
\- 表示需要有-
public static void regT(){
String content = "abc123-abc123";
// String regStr = "[0-9]+[a-z]*";
String regStr = "[0-9]+\\-[a-z]+";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
if (matcher.find()){
Log.i(TAG,"reg:" + matcher.group(0));
}
}
2023-08-17 20:01:29.666 26962-27135/cn.jj.reg I/JJWorld.MainActivity: reg:123-abc
public static void regT(){
String content = "abc123aabcdabcd 123 abcd assa";
// String regStr = "[0-9]+[a-z]*";
// String regStr = "[0-9]+\\-[a-z]+";
String regStr = "abc\\B";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
Log.i(TAG,"reg:" + matcher.group(0));
}
}
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc
\s
\s是一个特殊的转义字符,表示匹配任意的空白字符,包括空格、制表符、换行符等。
分组 重要
public void regGroup(){
String content = "hanshunping s7789 nn1189han";
String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
Log.i(TAG,"reg:" + matcher.group(0) + "-" + matcher.group(1) + "-" + matcher.group(2) + " g1 " + matcher.group("g1"));
}
}
2023-08-17 20:44:46.911 31878-32267/cn.jj.reg I/JJWorld.MainActivity: reg:7789-77-89 g1 77
2023-08-17 20:44:46.911 31878-32267/cn.jj.reg I/JJWorld.MainActivity: reg:1189-11-89 g1 11