正则表达式
能够用来校验字符串是否满足一定的规则
举个例子
//6-20位之间,0不能开头,必须全是数字 String qq="12345678" qq.matches("[1-9]\\d{5,19}")//返回结果为布尔类型
(?!)x可以忽略x的大小写
也可以自动生成正则表达式
爬虫
java.until.regex.Patern:表示正则表达式
java.until.regex.Matcher:文本匹配器,按照正则表达式的规则去读取字符串,大串中找符合规则的字串
String str="abcdefgh"//要查找的对象 Patern p=Pattern.complie("正则表达式规则")//获取正则表达式对象 Matcher m=p.macher(str);//获取文本匹配器的对象在str中找符合p规则的字串 m.find();//重头开始读取,如果无,返回false,有返回ture,同时在底层记录其实地址和结束地址+1; String s1= m.group();//截取字串 //因此可以写成循环来读取串中所有符合的对象 while(m.find) { String s1= m.group(); print(s1); }
带条件爬取
"((?i)Java)(?=8|11)"
爬取的带数字8|11的java,只输出java
"((?i)Java)(?:8|11)"
爬取的带数字8|11的java,只输出java+数字
"((?i)Java)(?!8|11)"
爬取的不带数字8|11的java
abbbbbbbaaa;
ab+
贪婪爬取:在爬取尽可能多获得数据
abbbbbb
ab+?
非贪婪爬取:尽可能少获取数据
ab
正则表达式在字符串
public String replaceAll(String regex,String newStr)
将符合规则的字符用newStr替代
public String split(String regex)
按照正则表达式规则切割字符串
分组
分组就是小括号,每一组有组号,以左括号划分组号,依次递增
例如上图中圈起来的括号中的\\d+是第二组
捕捉分组
把一组数据分组捕捉起来,再用一次
内部使用:\\组号
表示把第x组的内容再用一次
示例1:判断字符开始部分和结束部分是否一致?
String regex1="(.).+//1"; System.out.println("a123a".matches(regex1));//true
示例2:判断字符开始部分和结束部分是否一致?开始部分内部每个字符也要一致
Srring regex2="((.)\\2).+\\1"; System.out.println("aaa123aaa".matches(regex2))//true
外部使用:$
示例
str="abcdddd"; System,out.println(str.replaceAll("(.)\\1+","$1"));//abcd
非捕获分组
分组后不需要再用本组数据,仅仅是将数据括起来,不占用组号