正则表达式,学一次忘一次,这回必须给她做点标记,避免过几天她又不是我的东西了
前言:个人水平有限,可能并没有解释到您想要的程度,所以不足之处欢迎您的补充,愿我们一起进步,最后感谢您的阅览
一.正则表达式的使用
先上案例,有例子场景更清晰
对,用起来就是这么爽,想一想不用正则,你用if判断和for循环来做,会写多少行判断代码?
二.正则表达式语法
正则表达式中的中括号,[ ]是表示一个范围,在其范围之内为true,不在其范围中为false
总结
① ^为取反,去掉的意思
② - 代表是从… 到… 这个范围
③ &&是取两个范围的交集,单写一个&没有任何含义,就只是一个&字符
④(?i)abc 匹配时忽略abc的大小写
使用方式
str.matches("正则匹配内容")
str是一个要匹配的字符串,如果str在正则匹配范围中,就返回true,否则返回false
演示一个容易出错的,多注意,正则表达式是从左到右一个一个的去匹配的
"ab".matches("[abc]") //结果为false
"ab".matches("[abc][abc]") //结果为true
第一个a会跟第一个[abc]判断,第二个b会跟第二个[abc]判断
如果不想像上面那样一个字符一个字符匹配,就使用下面的数量词
使用实例如下
写正则表达式心得:拿着一个正确数据,从左到右,依次去写
转义字符 /
这里多提一嘴转义字符
这就是为什么正则匹配使用时会用 \ \d来表示一个数字,避免 \d 给转义了, 再加个\ ,让它变成普通的\字符
捕获分组
使用如下,下面是两个比较经典的需求,几个例子可能不太容易看懂,但认真看几遍就会很清晰
匹配开头和结束字符是否相同
判断开始部分和结束部分是否一致,部分内部字符也要相同
去掉重复字符
总结
不占用组号的意思就是,组号规则是从第一个左括号开,依次为第一组,第二组,而对于这种非捕获分组,它的左括号不算在组号规则内
三.正则表达式作用
1.校验字符串是否满足规则
可以用来匹配输入的是否满足定义的要求,常见的有输入手机号和验证码匹配
下面实例展示
验证手机号
验证邮箱
这里推荐一个idea的插件,AnyRule,根据范例改改就能用,比如下面
2.在文本中过滤需要内容
这个就相当于爬虫,从一段文本中过滤获取指定内容信息
m 文本匹配器对象
str 大串
p 匹配规则
m要再str中找到符合p规则的小串
拿着文本匹配器从头开始读取,寻找是否有满足规则的子串
如果没有,返回false;如果有,则返回true,其底层记录子串的起始索引和结束索引+1
find方法底层会根据find方法记录的索引进行字符串的截取。subString(起始索引,结束索引);包头不包尾
如(0,4)但是不包含4索引 会把截取的小串进行返回
public static void main(String[] args) {
String str = "东风夜放花千树,更吹落、星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。" +
"蛾儿雪柳黄金缕,笑语盈盈暗香去。众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。";
//获取正则表达式对象
Pattern p = Pattern.compile("千\\w{0,1}");
//获取文本匹配器对象
Matcher m = p.matcher(str);
//利用循环获取
while(m.find()){
String s = m.group();
System.out.println(s);
}
}
带条件爬取
注:这里的?:没有特殊含义,regex3和regex2是一样的,:只是代表前面的所有数据,非要理解的话,就是这种 java:8这种类型。这个?:也可以不写,(毕竟写不写没区别)但是AnyRule插件上是这么用的,不理解的话,用插件可能一脸懵。
贪婪爬取和非贪婪爬取
如下,ab+为贪婪爬取,ab+?为非贪婪爬取