菜鸟之路Day05一一正则表达式
作者:blue
时间:2025.1.23
概述:文章内容学习自BV17F411T7Ao,黑马程序员
本人对正则表达式的内容不敏感,听的时候,总是想不到其具体应用场景,仅记录下一些基础知识。
0.正则表达式的作用
①校验字符串是否满足规则
②在一段文本中查找满足要求的内容
1.校验字符串是否满足规则
1.1常用表示规则
①字符类(只匹配一个字符)
[abc] | 只能是a,b,c |
---|---|
[^abc] | 除了a,b,c以外的任何字符 |
[a-zA-Z] | a到z 或 A到Z |
[a-d[m-p]] | a到d 或 m到p |
[a-z&&[def]] | a-z和def的交集。为:d,e,f |
[a-z&&[ ^bc ]] | a-z和非bc的交集。(等同于[ad-z]) |
[a-z&&[ ^m-p ]] | a到z和除了m到p的交集。(等同于[a-lq-z]) |
String 中的一个方法:
测试:
package RegexDemo;
public class RegexDemo1 {
public static void main(String[] args) {
/*1*/
System.out.println("a".matches("[abc]"));//true
System.out.println("ab".matches("[abc]"));//false
System.out.println("ab".matches("[abc][abc]"));//true
System.out.println("--------------------------------");
/*2*/
System.out.println("a".matches("[^abc]"));//false
System.out.println("?".matches("[^abc]"));//true
System.out.println("--------------------------------");
/*3*/
System.out.println("m".matches("[a-zA-Z]"));//true
System.out.println("?".matches("[a-zA-Z]"));//false
System.out.println("--------------------------------");
/*4*/
System.out.println("m".matches("[a-d[m-p]]"));//true
System.out.println("--------------------------------");
/*5*/
System.out.println("m".matches("[a-z&&[def]]"));//false
System.out.println("e".matches("[a-z&&[def]]"));//true
System.out.println("--------------------------------");
/*6*/
System.out.println("b".matches("[a-z&&[^bc]]"));//false
System.out.println("e".matches("[a-z&&[^bc]]"));//true
System.out.println("--------------------------------");
/*7*/
System.out.println("p".matches("[a-z&&[^m-p]]"));//false
System.out.println("e".matches("[a-z&&[^m-p]]"));//true
}
}
②预定义字符(只匹配一个字符)
. | 任何字符 |
---|---|
\d | 一个数字: [0-9] |
\D | 非数字:[^0-9] |
\s | 一个空白字符 |
\S | 非空白字符: [^\s] |
\w | 英文、数字、下划线 |
\W | [^\w]一个非单词字符,其实就是对\w取反 |
package RegexDemo;
public class RegexDemo2 {
public static void main(String[] args) {
System.out.println("------------------------------");
System.out.println("m".matches("."));//true
System.out.println("你好".matches(".."));//true
System.out.println("------------------------------");
//第一个'\'代表转意字符
System.out.println("m".matches("\\d"));//false
System.out.println("9".matches("\\d"));//true
System.out.println("------------------------------");
System.out.println("m".matches("\\D"));//true
System.out.println("9".matches("\\D"));//false
System.out.println("------------------------------");
System.out.println("m".matches("\\D"));//true
System.out.println("9".matches("\\D"));//false
System.out.println("------------------------------");
System.out.println(" ".matches("\\s"));//true
System.out.println("9".matches("\\s"));//false
System.out.println("------------------------------");
System.out.println(" ".matches("\\S"));//false
System.out.println("9".matches("\\S"));//true
System.out.println("------------------------------");
System.out.println("_".matches("\\w"));//true
System.out.println("9".matches("\\w"));//true
System.out.println("------------------------------");
System.out.println(" ".matches("\\W"));//true
System.out.println("9".matches("\\W"));//false
}
}
③数量词
以上两种都只能匹配一个字符,加上数量词就可以匹配多个字符啦
X? | X,一次或0次 |
---|---|
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,正好n次 |
X{n,} | X,至少n次 |
X{n,m} | X,至少n但不超过m次 |
④逻辑词
- &&:并且
- | :或者
- \ :转义字符
1.2正则表达式练习
正则表达式的第一个作用是,校验字符串是否满足规则,以下写两个练习(现在写正则表达式的工具也比较多,就写两个比较简单的练习)
package RegexDemo;
public class RegexDemo3 {
public static void main(String[] args) {
//请编写正则表达式验证用户名是否满足要求。要求:大小写字母,数字,下划线一共4-16位
String Regex = "\\w{4,16}";
//简单要求:18位,前17位任意数字,最后一位可以是数字可以是大写或小写的x
String Regex1 = "[1-9]\\d{16}(\\d|X|x)";
System.out.println("41080119930228457x".matches(Regex1));
System.out.println("510801197609022309".matches(Regex1));
System.out.println("15040119810705387X".matches(Regex1));
System.out.println("130133197204039024".matches(Regex1));
System.out.println("430102197606046442".matches(Regex1));
}
}
2.在一段文本中查找满足要求的内容
2.1普通爬取
package RegexDemo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo4 {
public static void main(String[] args) {
//Pattern:表示正则表达式
//Matcher:文本匹配器,按照正则表达式的规则去读取字符串,从头开始读取,在大串中去找符合匹配规则的子串
//找出里面所有的Java
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//获取正则表达式对象
Pattern p = Pattern.compile("Java\\d{0,2}");
//文本匹配器对象
Matcher m = p.matcher(str);//拿着m去读取str,找符合p规则的字串
int num=0;//统计次数
while(m.find()){
String s = m.group();
System.out.println(s);
num++;
}
System.out.println(num);
}
}
2.2带条件的爬取
package RegexDemo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo5 {
public static void main(String[] args) {
String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//需求1:爬取版本号为8,11.17的Java文本,但是只要Java,不显示版本号。
//"?"代表前面的数据,=后面表示要跟随的数据,但取只取前面的数据
String regex1 = "Java(?=8|11|17)";
Pattern p = Pattern.compile(regex1);
Matcher m = p.matcher(s);
while(m.find()){
System.out.print(m.group()+" ");
}
System.out.println();
System.out.println("-------------------------------------");
//需求2:爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8 Java11 Java17 Java17
//:的话,获取的就是所有数据
String regex2 = "Java(?:8|11|17)";
Pattern p2 = Pattern.compile(regex2);
Matcher m2 = p2.matcher(s);
while(m2.find()){
System.out.print(m2.group()+" ");
}
System.out.println();
System.out.println("-------------------------------------");
//需求3:爬取除了版本号为8,11,17的Java文本
//!表示后面拼接内容出现的都不要,但是获取还是获取?前面部分
String regex3 = "Java(?!8|11|17)";
Pattern p3 = Pattern.compile(regex3);
Matcher m3 = p3.matcher(s);
while(m3.find()){
System.out.print(m3.group()+" ");
}
System.out.println();
System.out.println("-------------------------------------");
}
}
2.3贪婪爬取和非贪婪爬取
只写+和表示贪婪匹配,如果在+和后面加问号表示非贪婪爬取
+? 非贪婪匹配
*? 非贪婪匹配
贪婪爬取:在爬取数据的时候尽可能的多获取数据
非贪婪爬取:在爬取数据的时候尽可能的少获取数据