1. 正则表达式简介
2. 正则表达式语法
2.1 字符匹配符
2.2 选择匹配符
2.3 限定符
2.4 定位符
2.4 分组
3. 正则表达式三个常用类
4. 反向引用
5. String类使用正则表达式
基本介绍:
1.一个正则表达式,就是用某种模式去匹配字符串的一个公式。
2.其实很多语言都支持正则表达式操作,例如 Javascript、python、php等
基本使用:
public class RegExp_ {
public static void main(String[] args) {
groupReg();
normalReg();
}
// 正常匹配
public static void normalReg(){
// 用来匹配的内容
String content = "我爱写代码1998,但是我不想掉头发2001";
// 正则表达式
String regStr ="\\d{4}";
// 创建一个匹配模式,传入正则表达式
Pattern pattern = Pattern.compile(regStr);
// 创建一个匹配器,按照pattern来匹配
Matcher matcher = pattern.matcher(content);
// 循环匹配,检索,如果没有检索到就返回false
while (matcher.find()){
// 返回按照匹配规则,因为没有分组,matcher.group(0)返回匹配到的字符
System.out.println("找到 =" + matcher.group(0));
}
}
// 采用分组匹配
public static void groupReg(){
// 用来匹配的内容
String content = "我爱写代码1998,但是我不想掉头发2001";
// 正则表达式,采用分组,
// 匹配到的整段字符
// 起始位置索引存放在groups[]数组中的groups[0]中 5
// groups[1] 放的是整段字符索引的终止位置 + 1 9
// groups[2] 放的是 第1个分组匹配字符的起始位置 5
// groups[3] 放的是 第1个分组匹配字符的终止位置 7
// groups[4] 放的是 第2个分组匹配字符的起始位置 7
// groups[5] 放的是 第2个分组匹配字符的终止位置 9
String regStr ="(\\d{2})(\\d{2})";
// 创建一个匹配模式,传入正则表达式
Pattern pattern = Pattern.compile(regStr);
// 创建一个匹配器,按照pattern来匹配
Matcher matcher = pattern.matcher(content);
// 循环匹配,检索,如果没有检索到就返回false
while (matcher.find()){
// 返回按照匹配规则,因为没有分组,matcher.group(0)返回匹配到的字符
System.out.println("找到 " + matcher.group(0)); //找到 2001
// 采用分组,就可以取出分组的内容
System.out.println("找到分组1 " + matcher.group(1)); // 找到分组1 20
System.out.println("找到分组2 " + matcher.group(2)); // 找到分组1 01
}
}
}
基本介绍:
元字符从功能上大致分为一下几类:
1.字符匹配符
2.选择匹配符
3.限定符
4.定位符
5.特殊字符
6.分组组合和反向引用符
7.转义号:\ 符号,在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义字符,否则检索不出结果,甚至会报错。
[xyz] 字符集。匹配包含的任一字符。例如,"[abc]“匹配"plain"中的"a”。
[^xyz] 反向字符集。匹配未包含的任何字符。例如,"[^abc]“匹配"plain"中"p”,“l”,“i”,“n”。
[a-z] 字符范围。匹配指定范围内的任何字符。例如,"[a-z]“匹配"a"到"z"范围内的任何小写字母。
[^a-z] 反向范围字符。匹配不在指定的范围内的任何字符。例如,”[^a-z]“匹配任何不在"a"到"z"范围内的任何字符。
\b 匹配一个字边界,即字与空格间的位置。例如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er”。
\B 非字边界匹配。“er\B"匹配"verb"中的"er”,但不匹配"never"中的"er"。
\d 数字字符匹配。等效于 [0-9]。
\D 非数字字符匹配。等效于 [^0-9]
\f 换页符匹配。
\n 换行符匹配。
\r 匹配一个回车符。
\s 匹配任何空白字符,包括空格、>制表>符、换页符等。
\S 匹配任何非空白字符。
\t 制表符匹配。
\v 垂直制表符匹配。
\w 匹配任何字类字符,包括下划线。
\W 与任何非单词字符匹配。
(?i)abc 表示abc都不区分大小写匹配
a(?i)ab 表示bc不区分大小写
a((?i)b)c 表示b不区分大小写
Pattern pat = Pattern.complie(regExp,Pattern.CASE.INSENSITIVE) 表示不区分大小写匹配
简单演示:
public class RegExp01 {
public static void main(String[] args) {
String content = "abc132 ABC_@";
String regStr ="";
// 返回多少字符 除\n
// String regStr = ".";
// 返回abc其中一个 [abc]
regStr = "[abc]*"; // adc
// 返回非abc [^abc] ^取反的意思
regStr = "[^abc]";
// 返回数字 \\d
// regStr = "\\d*"; // 132
// 匹配空白字符 \\s
regStr = "\\s";
// 匹配非空白字符 \\S
regStr = "\\S";
// 匹配 任何字类字符类 \\w
regStr = "\\w";
// 匹配任何非字符 \\W 例如 @ 空格
regStr = "\\W";
// 匹配adc 不区分大小写
regStr = "(?i)abc"; // 找到:abc 找到:ABC
// 在这里添加 Pattern.CASE_INSENSITIVE 也表示不区分大小写匹配
Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.println("找到:" + matcher.group(0));
}
}
}
基本介绍:
在匹配某些字符串时候是选择性的,即:既可以匹配这个,也可以匹配那个,这时需要使用到匹配选择符
选择匹配符 : |
简单演示:
public class RegExp02 {
public static void main(String[] args) {
String content = "https:123http:";
// 表示既可以匹配 https 又可以匹配http
String regStr = "https|http";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
// 输出
// 找到:https
// 找到:http
System.out.println("找到:" + matcher.group(0));
}
}
}
基本介绍:
用于限定其前面的字符和组合项连续出现多次。
常用符号如下:
. 匹配除"\r\n"之外的任何单个字符。
* 零次或多次匹配前面的字符或子表达式。
+ 一次或多次匹配前面的字符或子表达式。
? 零次或一次匹配前面的字符或子表达式。
{n} n 是非负整数。正好匹配 n 次。
{n,} n 是非负整数。至少匹配 n 次。
{n,m} m 和 n 是非负整数,其中 n <= m,匹配至少 n 次,至多 m 次。
简单演示:
public class RegExp03 {
public static void main(String[] args) {
String content = "121233aabbccdd_eeefffgg";
String regStr = null;
// 匹配一个除\r\n外的所有字符
regStr = "\\d."; // 找到 12 找到 12 找到 33
// 匹配 零次多次
regStr = "(aa)*"; // 找到 aa
// 匹配 一次或多次
regStr = "(a)+"; // 找到 aa
// 匹配 3 数字 \\d{3}
regStr = "\\d{3}"; // 找到 121 找到 233
// 匹配 4-6个字母 ,因为模式是贪婪模式,有的话,会尽量匹配6个
regStr = "[a-z]{4,6}"; // 找到 aabbcc 找到 eeefff
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.print("找到 " + matcher.group(0) + " ");
}
}
}
基本介绍:
定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个也是相当有用的,必须掌握。
常见定位符:
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。
\b 匹配一个字边界,即字与空格间的位置。例如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er"。
\B 非字边界匹配。“er\B"匹配"verb"中的"er”,但不匹配"never"中的"er"。
简单演示:
public class RegExp04 {
public static void main(String[] args) {
String content = "hello mary 123";
// 匹配以字母开头,数字结尾的字符串
String regStr = "^[a-z]+\\s\\w+\\s\\d+$";
// 下面是没有匹配结果的 ,因为 ar不在结尾 或者空格之间
regStr = "\\w+ar\\b";
// 下面
regStr = "\\w+ry\\b"; // 找到 mary
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.print("找到 " + matcher.group(0) + " ");
}
}
}
基本介绍:
(pattern) 匹配 pattern 并捕获该匹配的子表达式
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。
(?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹>配,即不能捕获供以后使用的匹配。
(?!pattern) 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非>捕获匹配,即不能捕获供以后使用的匹配。
简单演示:
public class RegExp {
public static void main(String[] args) {
String content = "张三是帅哥 张三是法外狂徒 张三是普通市民";
// 匹配括号中内容作为一个子字符串
String regStr = "张三是([\u0391-\uffe5]+)";
// 上述也可以写成 采用 (?:pattern)
regStr = "张三是(?:帅哥|法外狂徒|普通市民)";
// 如果执行得到前面的一部分可以此阿勇 (?=pattern) ,下面只返回三个张三是
regStr = "张三是(?=帅哥|法外狂徒|普通市民)";
// 与上面的取反 ,下面不返回任何结果
regStr = "张三是(?!=帅哥|法外狂徒|普通市民)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.println("找到:" + matcher.group(0));
}
}
}
基本介绍:
java.util.regex包主要包括下面三个类,Pattern类,Matcher类和PatternSyntaxException类
Pattern类:
pattern 对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个Pattern对象,调用其公共静态方法,它返回一个Pattern对象,该方法接受一个正则表达式作为第一个参数 例如:Pattern pattern = Pattern.compile(regStr);
Matcher类:
Matcher对象是输入字符串进行解释和匹配的引擎。与Pattern类一样,Matcher也没有公共的构造方法,需要调用Pattern对象的matcher的方法来获得一个Matcher对象。
Matcher类的常用方法:
public int start(int group)返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
public int end(返回最后匹配字符之后的偏移量)
public int end(int group)返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
public boolean lookingAt( 尝试将从区域开头开始的输入序列与该模式匹配)。
public boolean findQ尝试查找与该模式匹配的输入序列的下一个子序列。
public boolean find(int start)重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下
一个子序列。
public boolean matches()尝试将整个区域与模式匹配
简单演示:
public class RegExp02 {
public static void main(String[] args) {
String content = "http:/www.ease.center";
// 表示既可以匹配 https 又可以匹配http
String regStr = "^(https|http):/\\w*\\.\\w*\\.[a-z]*$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
// 可以直接判断是否完全匹配, 使用matches()
boolean matches = matcher.matches();
if (matches){
System.out.println("验证成功!");
}else {
System.out.println("验证失败!");
}
while (matcher.find()){
System.out.println("找到:" + matcher.group(0));
// 与上面输出一致
System.out.println("找到:" + matcher.group(0).substring(matcher.start(),matcher.end()));
}
}
}
PatternSyntaxException类:
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
基本介绍:
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用11分组号,外部反向引用 $分组号。
简单演示:
public class RegExp05 {
public static void main(String[] args) {
String content = "1212123123";
// 使用 反向引用匹配重复字符串
// 每一个分组,可以使用 \\1-9 来使用前面分组
String regStr = "(\\d{2})\\1(\\d{3})\\2";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.print("找到 " + matcher.group(0) + " ");
}
// 结巴案例
content = "我我...爱爱爱..写写..代代码码!";
// 将字符串中 ... 去除
content = content.replaceAll("\\.", "");
regStr = "(.)\\1+";
pattern = Pattern.compile(regStr);
Matcher matcher1 = pattern.matcher(content);
// 匹配到了的所有group中的字符串,全部用(.)匹配到的替换,消除了重复
content = matcher1.replaceAll("$1");
System.out.println(content);
//另种写法 直接按照模板匹配,然后直接替换
content = Pattern.compile(regStr).matcher(content).replaceAll("$1");
System.out.println(content);
}
}
基本介绍:
1.public String replaceAll(String regex, String replacement): 字符串替换
2.public String split(String regex) :字符串拆分
3.public String matches(String regex) :验证字符串
简单演示:
public class StringRexExp {
public static void main(String[] args) {
String content = "hello world1,i am fine";
// 替换 world1 为 mary
String mary = content.replaceAll("\\w+\\d$", "mary");
System.out.println(mary);
// 根据 空格 或者 , 分割
String[] split = content.split(" |,");
for (String s :split) {
System.out.println(s);
}
// 判断格式是否正确
String phoneNum ="13988889999";
// 验证是否以138 或者 139开头
if (phoneNum.matches("^(138|139)\\d{8}")){
System.out.println("验证通过");
}else {
System.out.println("验证失败");
}
}
}
正则表达式小结,欢迎大家交流学习!