字符类
- [abc]:代表a或者b,或者c字符中的一个。
- [^abc]:代表除a,b,c以外的任何字符。
- [a-z]:代表a-z的所有小写字符中的一个。
- [A-Z]:代表A-Z的所有大写字符中的一个。
- [0-9]:代表0-9之间的某一个数字字符。
- [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
- [a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。
逻辑运算符
-
&&:并且
-
| :或者
-
\:转义字符
// 代码示例 // 1.要求字符串是小写辅音字符开头,后跟ad String regex = "[a-z&&[^aeiou]]ad" // 2.要求字符串是aeiou中的某个字符开头,后跟ad regex = "[a|e|i|o|u]ad"; // 相当于 regex = "[aeiou]ad"; // 3.要求以字符串的形式打印一个双引号 System.out.println("\"");
预定义字符
- “.” : 匹配任何字符;
- “\d”:任何数字[0-9]的简写;
- “\D”:任何非数字[^0-9]的简写;
- “\s”: 空白字符:[\t\n\x0B\f\r]的简写;
- “\S”: 非空白字符:[^\s] 的简写;
- “\w”:单词字符:[a-zA-Z_0-9]的简写
- “\W”:非单词字符:[^\w]
数量词
- X? : 0次或1次
- X* : 0次到多次
- X+ : 1次或多次
- X{n} : 恰好n次
- X{n,} : 至少n次
- X{n,m}: n到m次(n和m都是包含的)
练习
// 1.编写正则表达式验证用户输入的手机号码是否满足要求
// 第一部分:1 表示手机号码只能以1开头
// 第二部分:[3-9] 表示手机号码第二位只能是3-9之间
// 第三部分:\\d{9} 表示任意数字可以出现9次,也只能出现9次
String cellPhone = "1[3-9]\\d{9}";
// 2.编写正则表达式验证用户输入的邮箱号是否满足要求
// 第一部分:@的左边 \\w+ 任意字母数字下划线,至少出现一次就可以了
// 第二部分:@ 只能出现一次
// 第三部分:
// 3.1:.的左边 [\\w&&[^_]]{2,6} 任意的字母加数字,总共出现2-6次(不能出现下划线)
// 3.2:. \\.
// 3.3:大小字母,小写字母都可以,只能出现2-3次[a-zA-Z]{2,3}
// 把3.2和3.3看成一组,这一组可以出现1次或者2次
String email = "\\w@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
// 3.编写正则表达式验证用户输入的电话号码是否满足要求
// 第一部分:区号 0\\d{2,3}
// 0 表示区号一定是以0开头的
// \\d{2,3} 表示区号从第二位开始可以是任意的数字,可以出现2-3次
// 第二部分:-? 表示"-"出现次数,0次或1次
// 第三部分:号码 [1-9]\\d{4,9} 号码的第一位也不能以0开头,从第二位开始可以是任意的数字,号码的总长度为5-10位
String telephone = "0\\d{2,3}-?[1-9]\\d{4,9}";
贪婪爬取与非贪婪爬取
只写+ 和 * 表示贪婪匹配,如果在+和 * 后面加? 表示非贪婪爬取
-
+:贪婪匹配
-
*:贪婪匹配
-
+?:非贪婪匹配
-
*?:非贪婪匹配
-
贪婪爬取:在爬取数据的时候尽可能的多获取数据
-
非贪婪爬取:在爬取数据的时候尽可能的少获取数据
-
举例:
如果爬取数据:ab+
贪婪爬取获取结果:abbbbbbbb
非贪婪爬取获取结果:ab
分组
-
分组括号()
-
\\组号:表示把第X组的内容再用一次,如何识别组号,只看左括号不看右括号
-
分组练习
// 需求:把重复的内容替换为单个的 String str = "我要学学编编编编程程程程程程"; // (.) 表示把重复内容的第一个字符看做一组 // \\1 表示第一组字符再次出现 // + 表示至少一次 // $1 表示把正则表达式中第一组的内容,再拿出来用 String result = "str.replaceAll("(.)\\1+","$1"); System.out.println(result);
忽略大小写的写法
(?i)
:表示忽略后面数据的大小写- 例如:
"(?i)abc
”:表示忽略abc的大小写
非捕获分组
- 分组之后不需要再用本组数据,仅仅是把数据括起来。
(?:)
(?=)
(?!)
:都是非捕获分组,更多使用第一个- 例如:
"[1-9]\d{16}(?:\d|x|x)\1
”:报错,因为(?:)是非捕获分组,此时是不占用组号的。