正则表达式定义了字符串的模板 可以对字符串(或文本,大量的字符串构成了文本)进行查找 提取 分割 替换等操作
什么是模板?可以是简单字符 固定的字符串 或包含了特殊字符的组合
有了模板 就可以用这个规则去匹配字符串了 匹配到了就可以进行相应的操作
简单的例子:
查找name字符串中是否包含了tony
String name = "tonytonytonytony";
这个例子中模板就是字符串"tony"
匹配的字符串就是name
那操作是什么? 如果匹配到了你可以进行替换了
但是name中有4个tony 你是匹配到一个就替换了 还是全部替换
这个可以在后续操作中进行指定
所以 学习正则表达式就是学习如何去指定这个模板规则
Java对于正则表达式的支持表现在java.util.regex下的MatchResult接口和几个类
Matcher Pattern PatternSyntaxException中
模板中支持的合法字符及含义(部分)
详细介绍 可以查阅API文档
一旦创建好了模板 就可以使用Java提供的类来使用正则表达式了
package com.tony;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
// 匹配的目标
String name = "tonytonytonytony";
// Pattern对象是正则表达式编译后在内存中的表示形式
// 为什么要编译到内存中 ? 便于多次使用 提升执行性能
// 相当于创建了模板 这个模板可以被重复使用
Pattern pattern = Pattern.compile("tony");
// matcher方法执行匹配 返回Matcher匹配器
Matcher matcher = pattern.matcher(name);
// 完全匹配
System.out.println("完全匹配:" + matcher.matches()); // false
int count=0;
// find()无参方法 默认从0开始匹配
while(matcher.find()) {
count++;
System.out.println("开始索引:" + matcher.start());
System.out.println("结束索引:" + matcher.end());
}
System.out.println("tony出现的次数:" + count);
System.out.println("==================");
System.out.println(matcher.find(3));
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println(matcher.find());
System.out.println(matcher.start());
System.out.println(matcher.end());
}
}
输出结果:
完全匹配:false
开始索引:0
结束索引:4
开始索引:4
结束索引:8
开始索引:8
结束索引:12
开始索引:12
结束索引:16
tony出现的次数:4
==================
true
4
8
true
8
12
find():无参方法 匹配到内容 下次匹配从下一个子字符串开始
find(1):有参方法 指定开始匹配的索引 一次匹配成功 又开始从原字符串的索引位开始匹配 (不是相对于子字符串的索引位置匹配 所以死循环)
package com.tony;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
// 匹配的目标
String name = "tonytonytonytony";
// Pattern对象是正则表达式编译后在内存中的表示形式
// 为什么要编译到内存中 ? 便于多次使用 提升执行性能
// 相当于创建了模板 这个模板可以被重复使用
Pattern pattern = Pattern.compile("tony");
// matcher方法执行匹配 返回Matcher匹配器
Matcher matcher = pattern.matcher(name);
// lookingAt()的理解
System.out.println(matcher.lookingAt());
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println(matcher.find());
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println(matcher.lookingAt());
System.out.println(matcher.start());
System.out.println(matcher.end());
// lookingAt:部分匹配 总是从第一个字符进行匹配 匹配成功了不再继续匹配
// 匹配失败了也不继续匹配
System.out.println("=================");
// reset()的理解
System.out.println(matcher.find());
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println(matcher.find());
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println("===reset===");
Matcher return_matcher = matcher.reset();
System.out.println(matcher == return_matcher); // true
System.out.println(matcher.find());
System.out.println(matcher.start());
System.out.println(matcher.end());
// reset() 无参的方法 重置配置的位置(从0开始 指针移动到最开始出)
// 返回Matcher对象
// reset(有参的理解)
System.out.println("===reset(params)===");
System.out.println(matcher.find());
System.out.println(matcher.start());
System.out.println(matcher.end());
matcher.reset("文心tony");
System.out.println(matcher.find());
System.out.println(matcher.start());
System.out.println(matcher.end());
// 重置匹配的位置 重置匹配的目标
// group() 不分组的情况下(什么是分组 在2中研究)
// 返回由以前匹配操作所匹配的输入子序列(模板)
System.out.println(matcher.group());
}
}
true
0
4
true
4
8
true
0
4
=================
true
4
8
true
8
12
===reset===
true
true
0
4
===reset(params)===
true
4
8
true
2
6
tony