爬虫:在一段文本中寻找到满足正则表达式的目标并记录。
public static void main(String[] args) {
String str="java是一种很好用的语言,java12是一种无所不能的语言,java134是啥我也不知道哈哈哈啊哈哈哈,java22";
//1、获取目标正则表达式对象,定义一种规则
Pattern p=Pattern.compile("java\\d{0,2}");
//2、拿着m去寻找str中符合p规则的串
Matcher m=p.matcher(str);
while(m.find()){
//获取到就会返回true并切保存坐标
//遍历完就会返回false
//根据find方法截取的字符串进行字符串的截取
//拿着文本匹配起从头读区,看看有没有满足条件的子串
//没有返回false
//有的话返回true,并且在底层记录其实索引和结束索引+1
String s=m.group();
System.out.println(s);
}
}
带条件的爬取
通过非捕获分组进行爬取,?=匹配时看全部,保留前面
public static void main(String[] args) {
//?表示前面的数据java
//=表示java后所需要跟随的数据
//但是在获取的时候只获取前部分
String str="java是一种很好用的语言,Java11是一种无所不能的语言,java7是啥我也不知道哈哈哈啊哈哈哈,java8";
String regex="((?i)java)(?=7|8|11)";
//(?i)忽略大小写
//获取正则表达式
Pattern p=Pattern.compile(regex);
//用m根据p寻找数据
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
贪婪爬取
举个例子:abbbbbbbbbbbbbbaaaaaaaaaaaa
按照ab+的方法进行爬取
b尽可能多的获取->贪婪爬取,默认都为贪婪爬取
b尽可能少的获取->非贪婪爬取
public static void main(String[] args) {
//贪婪爬取:尽可能多的获得数据
//非贪婪爬取:尽可能少的获取数据
/*
ab+:
贪婪爬取:abbbbbbbbb
非贪婪爬取:ab
java中默认的就是贪婪爬取
如果我们在数量词+*的后面加上问号,此时就是非贪婪爬取
*/
String str="abbbbbbbbbbbbaaaaaaaaaa大牌呢打发发发发发发呢了你疯了"
+"打烦恼发吧饿哦烦恼你发嗯飞飞飞";
String regex="ab+?";//在这个问号后面加上?就变成了非贪婪爬取
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
1、捕获分组和非捕获分组:
正则表达式有这两种
2、捕获分组(默认):
可以获取每组中的内容并反复使用
3、组号特点:
从1开始连续不间断
以左括号为基准,最左边是第一组
4、非捕获分组:
分组过后不需要再使用本组数据,仅仅把数据括起来,不含组号。
public static void main(String[] args) {
//规则1:从1开始,连续不间断
//规则2:以左括号为基准,最左边是第一组,其次为第二组,以此类推
//捕获分组就是将这一组的数据捕获出来,再用一次
//需求:看前面的字符和后面的字符是否相等,一个或者多个字符?
//开始部分的每个字符是否也相等?
// \\数字 表示把前面的内容拿过来复用
String regex="(.).+\\1";
System.out.println("a123a".matches(regex));//一个字符
String regex1="(.+).+\\1";
System.out.println("abc123abc".matches(regex1));
// *表示可以出现0次或者多次
String regex2="((.)\\2*).+\\1";//左括号排序,里面的东西是第二个括号
System.out.println("aac123aac".matches(regex2));
}
public static void main(String[] args) {
//去掉redundant字符
String str="我要学学学编编编编编程程程程";
//把重复第一个字符看做一组
String regex="(.)\\1+";
//$1表示把正则表达式第一组的内容拿出来用,因为在外部使用需要$1
//每一组都按照左边的括号开始划分
System.out.println(str.replaceAll(regex, "$1"));
//?: ?相当于前面的数据,匹配时看整体,保存整体
//?= ?相当于前面的数据,匹配时看整体,保存前面
//?! ?相当于前面的数据,匹配时看整体(匹配这个整体之外的),
//非捕获分组仅仅将数据括起来,它不占用组号
}
正则表达式在字符串中的应用
public static void main(String[] args) {
//字符串的校验
//matches
。。。。。。。。。
。。。。。。。。。
。。。。。。。。。
//字符串的替换
String str="小明abcde小红abcde小刚abcde";
//以前学过replace方法,使用字符进行全部替换
String result=str.replaceAll("[\\w&&[^_]]+","vs");
System.out.println(result);
//字符串的切割,切割满足正则表达式的目标
//会以数组的方式返回数据
String[] arr=str.split("[\\w&&[^_]]+");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}