Pattern:表示正则表达式
Mathcer:文本匹配器,按照正则表达式的规则去读取字符串
匹配语法:
Pattern p = Pattern.compile("正则表达式"); //获取正则表达式对象
Matcher m = p.matcher("要查询的大字符串"); //获取文本匹配器对象
boolean result = m.find(); //调用find方法将查询的结果返回,索引会停留在第一次找到的地方,如果要遍历完大字符串的内容,需要使用循环
String str = m.group(); //该方法底层是根据find记录的索引进行字符串截取
因此,如果想要将大字符串中所有符合正则表达式的内容截取出来,代码如下所示:
应用场景1:本地爬虫
Pattern p = Pattern.compile("正则表达式");
Matcher m = p.matcher("要查询的大字符串");
String[] arr ;
while(m.find()){
String str = m.group();
System.out.println(str);
}
应用场景2:爬取网页中的特定字符串
//创建一个URL对象
URL url = new URL("输入要爬取的网页");
//连接上这个网址
URLConnection conn = url.openConnection();
//创建一个对象去读取网络中的数据
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
//创建pattern对象存储正则表达式
String regex = "正则表达式";
Pattern p = Pattern.compile(regex);
while ((line = br.readLine()) != null){
//System.out.println(line);
//按照pattern的规则,将文本匹配器和网络数据进行匹配截取
Matcher m = p.matcher(line);
while (m.find()){
System.out.println(m.group());
}
}
br.close();
关于正则表达式的一些小技巧:
1、"?i":表示忽略大小写
2、"?=":表示查询后面跟随的数据,但是获取的时候只要"?="前半部分
3、"?:":表示在获取时只要后面跟随的数据
4、"?!":表示在获取时不要后面跟随的数据
贪婪爬取与非贪婪爬取
贪婪爬取:在获取数据时尽可能多的获取数据
非贪婪爬取:在获取数据时尽可能少的获取数据
Java当中默认的就是贪婪爬取
贪婪匹配语法:只写"+"或者"*"
非贪婪匹配语法:"+?"或者是"*?"
贪婪匹配展示:
String str = "我们经常说wtttttttttttttttttttf来表示震惊";
String regex = "wt+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
String group = matcher.group();
System.out.println(group); //wttttttttttttttttttt
}
非贪婪匹配展示:
String str = "我们经常说wtttttttttttttttttttf来表示震惊";
String regex = "wt+?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
String group = matcher.group();
System.out.println(group); //wt
}
一些关于正则表达式在字符串方法中的使用:
1、public String[] matches(String regex) //判断字符串是否满足正则表达式
2、public String replaceAll(String regex, String newStr) //按照正则表达式的规则进行替换
3、public String[] split(String regex) //按照正则表达式的规则切割字符串
捕获分组和非捕获分组
一、捕获分组:把这一组的数据捕获出来,在使用一次
正则内部使用:\\组号
正则外部使用:$组号
关于捕获分组的练习
1、判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符。例:a123a &123&
正则表达式为:"(.).+\\1"
其中\\1表示把第1组的内容再拿出来用一次
使用方式为:"a123a".matches("(.).+\\1"); //true
2、判断一个字符串的开始部分和结束部分是否一致?可以有多个字符。例:abc123abc bb235bb
正则表达式为:"(.+).+\\1"
使用方式为:"abc123abc".matches("(.+).+\\1"); //true
3、判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要保持一致。例:aaa123aaa bbasdfgbb
正则表达式为:"((.)\\2*).+\\1"
其中,\\2表示将第二组的内容即(.)拿出来在使用一次,而*作用于\\2表示出现0次或多次,\\1表示将第一组的内容即((.)\\2*)拿出来在使用一次
二、非捕获分组:分组之后不需要再使用本组数据,仅仅是把数据括起来
(?:regex) :获取所有
(?=regex) :获取前面部分
(?!regex) :获取不是指定内容的前面部分