文章目录
- 前言
- 一、正则表达式
- 1 [ ] 语法
- (1)[ABC] 和 [^ABC]
- (2)[A-Z]和[a-zA-Z]
- 小总结
- 2 特殊字符语法(\w 这些)
- 3 数量符
- 4 \ 、()、 |
- 5 锚点 ^ 和 $,\b,\B
- 6 (?i) : 忽略其后面的大小写 ---- 这个Java是可以的,其他语言我不知道(正则表达式虽然大多通用,但也有部分是各语言独有的)
- 7 一个完美匹配各种邮箱的应用
- 二、Java String里面的正则表达式练习
- 1 public boolean matches(String regex) : 判断此字符串是否与给定的 正则表达式 匹配。
- 2 正则表达式练习
- 3 正则表达式插件 any-rule
- 三、爬虫、带条件爬取和懒惰匹配、贪婪匹配
- 1 本地爬虫
- 2 网络爬虫
- 3 带条件爬取和贪婪爬取
- (1)带条件爬取 :(?=exp)、(?!exp)、(?:exp)
- (2) 非贪婪爬取与贪婪爬取:+?、*?
- 四、 String 里面的正则表达式方法
- 1 public boolean matches(String regex): 判断此字符串是否与给定的 正则表达式 匹配。
- 2 public String replaceAll(String regex, String replacement):用给定的替换替换此字符串中与给定的 正则表达式 匹配的每个子字符串。
- 3 public String[] split(String regex) : 围绕给定 正则表达式 的匹配项拆分此字符串。
- 五、捕获分组与非捕获分组
- 1 分组 :()
- 2 捕获分组:\1(内部用)、$1(外部用)
- 3 非捕获分组 :(?:正则)、(?= 正则)、(?!正则)
- 六、总结
前言
没错,Java也是可以进行爬虫的,正则表达式所有语言都是通用的。
一、正则表达式
正则表达式基本语法没什么好说的,下面给出几个学习网站
正则表达式语法
正则表达式备忘清单,在线练习
正则表达式在线工具
正则表达式博客这篇博客我看访问量很大
下面我们只给出一下最基本的,最好能记住的
1 [ ] 语法
(1)[ABC] 和 [^ABC]
- [ABC]:匹配 […] 中的所有字符
例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。
- [^ABC] : 匹配除了 […] 中字符的所有字符
例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字符。例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字符。
(2)[A-Z]和[a-zA-Z]
- [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。
- 推广[a-zA-Z] 表示 ,匹配所有大写字母和小写字母
例如[a-zA-Z0-9_-] 表示字符集,包含小写字母、大写字母、数字、下划线和连接字符 -
小总结
可以看到上述(1)(2)是可以结合在一起灵活应用的
2 特殊字符语法(\w 这些)
-
(1) . 点 :匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]。
-
(2)\w :匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
-
(3)\W : 匹配除字母、数字和下划线之外的任意字符。等价于[^\w]
-
(4)\d :匹配任意一个阿拉伯数字(0 到 9)。等价于 [0-9]
-
(5)\D : 匹配除数字外的任意字符。等价于[^0-9]
-
(6)\s : 匹配所有空白符(包括换行符)。等价于[\n\t\r\f\x0B]
-
(7)\S:匹配所有非空白符(不包括换行符)。等价于[^\s]
-
(8)[\s\S] : 结合起来就是匹配所有
3 数量符
- (1)+ :匹配前面的子表达(如果用()括起来就是括号内部,没有就是+前一个字符)式一次或多次。
例如,zo+ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 - (2)* :匹配前面的子表达式零次或多次。
例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于 {0,}。 - (3)? :匹配前面的子表达式零次或一次。
例如,do(es)? 可以匹配 “do” 、 “does”、 “doxy” 中的 “do” 和 “does”。? 等价于 {0,1}。 - (4){n} :n 是一个非负整数。匹配确定的 n 次。
例如,o{2} 不能匹配 “Bob” 中的 o,但是能匹配 “food” 中的两个 o。 - (5){n,} :n 是一个非负整数。至少匹配n 次。
例如,o{2,} 不能匹配 “Bob” 中的 o,但能匹配 “foooood” 中的所有 o。o{1,} 等价于 o+。o{0,} 则等价于 o*。 - (6){n,m} :m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。
例如,o{1,3} 将匹配 “fooooood” 中的前三个 o。o{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。
4 \ 、()、 |
- (1)\ :转义符
例如,前面说过 **.**匹配所有字母、数字和下划线,如果我只是想单纯的点呢? 那就 \. - (2)(): 圆括号 () 用于创建子表达式,具有高于其他运算符的优先级。
示例:(abc)+ 匹配 “abc” 一次或多次。 - (3)| :管道符号 | 表示"或"关系,用于在多个模式之间选择一个。
示例:cat|dog 匹配 “cat” 或 “dog”。
5 锚点 ^ 和 $,\b,\B
- ^ : 匹配输入字符串的开始位置,匹配字符串或行的开头。
示例: - $ : 匹配字符串或行的末尾。
示例: - \b :单词边界,匹配单词的开头或末尾。
示例: - \B: 非单词边界,匹配不在单词开头或末尾的位置。
示例:
6 (?i) : 忽略其后面的大小写 ---- 这个Java是可以的,其他语言我不知道(正则表达式虽然大多通用,但也有部分是各语言独有的)
这个有灵活应用,注意看下面演示,下面都以 abc 为例子给出
- (?i)abc : 表示忽略后面所有字符的大小写匹配 ,例如,可以匹配 ABC aBC abC abc等
- a(?i)bc:表示忽略bc的大小写匹配,例如,aBC,aBc,abc,abC
- a((?i)b)c: 表示只忽略b的大小写,例如,aBc,abc
7 一个完美匹配各种邮箱的应用
掌握了上面哪些,基本就够用了,下面是一个完美匹配邮箱的正则表达式
二、Java String里面的正则表达式练习
1 public boolean matches(String regex) : 判断此字符串是否与给定的 正则表达式 匹配。
- String regex : 正则表达式
注意:Java中的" "经常会将 \ 识别失败,python中是在 r“ ” 这样解决这个问题,但Java不能这么解决,Java只能采用 \ 替换 \ (通常路径中我们就是要这么处理), 因此我们在正则表达式中也要用 \ 来替换 \,简单来说Java中 \ = \
String s = "abc";
System.out.println(s.matches("[a-z]*")); // true
System.out.println(s.matches("a")); // falseString s2 = "a\\j";
System.out.println(s2.matches("a\\\\j")); // true 两条\\ 才能匹配到一个\
System.out.println(s2.matches("[ab]")); // falseSystem.out.println("3".matches("\\d")); // true
下面就给出大量演示帮助进一步理解上面的正则表达式语法
// [] 只能匹配一位字符
System.out.println("----------1---------------");
System.out.println("a".matches("[abc]")); // true
System.out.println("z".matches("[abc]")); // false
System.out.println("ab".matches("[abc]")); // false
System.out.println("ab".matches("[abc][abc]")); // true// 不能出现 a b c
System.out.println("----------2---------------");
System.out.println("a".matches("[^abc]")); // false
System.out.println("z".matches("[^abc]")); // true
System.out.println("zz".matches("[^abc]")); // false
System.out.println("zz".matches("[^abc][^abc]")); // true// a到z A到Z 0到9
System.out.println("----------3---------------");
System.out.println("a".matches("[a-zA-Z]")); // true
System.out.println("z".matches("[a-zA-Z]")); // true
System.out.println("aa".matches("[a-zA-Z]")); // false
System.out.println("aa".matches("[a-zA-Z][a-zA-Z]")); // true
System.out.println("A".matches("[a-zA-Z]")); // trueSystem.out.println("e".matches("[a-dm-p]")); // false
System.out.println("b".matches("[a-dm-p]")); // true
System.out.