第十章、正则表达式
第十章、正则表达式
1. 基本概述
由事先定义好的特殊字符以及这些特殊字符组成,组成一个“规则的表达式”,这是表达式用来
对字符串进行过滤逻辑。
2. 语法格式
Java中正则表达式的语法格式:""
JS中正则语法格式:/ /
3. 运用场景
1.检测用户输入的合法性
2.检索、替换文本
4. 正则表达的组成
由普通字符和特殊字符(元字符)组成。
字符
x 字符 x 。 举例:'a' 表达式字符a
\\ 反斜杠字符
\n 换行
\r 回车符
字符类
[abc] 表示abc中任意单个字符
[^abc] 表示除了abc任意单个字符
[a-zA-Z] 表示a到z A到Z中任意单个字符
[0-9] 表示0-9任意单个字符
预定义字符类
. 除了换行符以外的任意单个字符。 我的就是.字符本身,怎么表示呢? \.
\d 数字[0-9]
\D 非数字: [^0-9]
\w 数字字母下划线[a-zA-Z_0-9]
\W 非单词字符:[^\w]
\s 空白字符
\S 非空白字符:[^\s]
边界匹配器
^ 开头
$ 结尾
\b 单词边界
数量词
X? 表示X可以出现一次或一次也没有
X* 零次或多次
X+ 一次或多次
X{n} 恰好 n 次
X{n,} 至少 n 次
X{n,m} 至少 n 次,但是不超过 m 次
特殊符号
() 子字符集
| 或
&& 与
\ 转义字符
? 设置括号内的选项是可选的
5. 代码示例
-
演示正则表达式用法
package day15; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * 演示正则表达式用法 */ public class Regex1 { public static void main(String[] args) { // 1.编写正则表达式,匹配abc找那个任意三个字符 String reg1 = "[abc]$"; // 2.编写正则表达式匹配abc中任意3个字符 String reg2 = "[abc]{3}"; // 3.编写正则表达式匹配字母数字,要求出现0次或1次 String reg3 = "[0-9a-bA-Z]?"; // 4.编写正则表达式匹配字母数字下划线 String reg4 = "\\w"; // 出现一个问题 表达式写好了,该如何自定义字符串进行匹配呢? System.out.println("---------第一种匹配方式---------"); boolean bool = "adc".matches(reg1); System.out.println(bool); bool = "acc".matches(reg2); System.out.println(bool); System.out.println("---------第二种匹配方式---------"); bool = Pattern.matches(reg3, "9"); System.out.println(bool); System.out.println("---------第三种匹配方式---------"); // compile(String regex) 将给定的正则表达式编译到模式中 // 将给定的正则表达式编译到模式中 Pattern pattern = Pattern.compile(reg4); // Matcher matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器 // 创建匹配给定输入与此模式的匹配器 Matcher matcher = pattern.matcher("6"); // 尝试将整个区域与模式匹配 bool = matcher.matches(); System.out.println(bool); } }
-
作业一
package day15; /* * 1.验证用户名 字母开头4-6位,数字字母下划线 * 2.手机号11位 * 3.验证QQ号码 3-13位 * 4.验证邮箱 * 5.验证身份证 * 6.验证用户2-4位汉字 * 7.验证用户名 数字字母必须都包含 */ public class Regex2 { public static void main(String[] args) { // 1.验证用户名 字母开头4-6位,数字字母下划线 String reg1 = "^[a-zA-Z]\\w{3,5}"; boolean bool = "sd_3".matches(reg1); System.out.println(bool); System.out.println("----------------------"); // 2.手机号11位 String reg2 = "\\d{11}"; bool = "15879680697".matches(reg2); System.out.println(bool); System.out.println("----------------------"); // 3.验证QQ号码 3-13位 String reg3 = "\\d{3,13}"; bool = "15879680697".matches(reg3); System.out.println(bool); System.out.println("----------------------"); // 4.验证邮箱 String reg4 = "[a-zA-Z0-9]+@[a-zA-Z]+\\.com"; bool = "158796df@qq.com".matches(reg4); System.out.println(bool); System.out.println("----------------------"); // 5.验证身份证 String reg5 = "[0-9]{18}"; bool = "362401200003214417".matches(reg5); System.out.println(bool); System.out.println("----------------------"); // 6.验证用户2-4位汉字 String reg6 = "[\u4e00-\u9fa5]{2,4}"; bool = "娃哈哈".matches(reg6); System.out.println(bool); System.out.println("----------------------"); // 7.验证用户名 数字字母必须都包含 // ?![0-9]$ ?![a-zA-Z]$ String reg7 = "(?![0-9]+$)(?![a-zA-Z]+$)[0-9a-zA-Z]*"; bool = "asjfvf".matches(reg7); System.out.println(bool); System.out.println("----------------------"); // 8.验证用户名 数字字母下划线必须都包含 // ?![0-9]$ ?![a-zA-Z]$ String reg8 = "(?![0-9]+$)(?![a-zA-Z]+$)(?![0-9a-zA-Z]+$)[0-9a-zA-Z_]*"; bool = "asjfv2_f".matches(reg8); System.out.println(bool); } }
-
作业二
package day15; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * 获取功能 * 获取下面这个字符串中由三个字符组成的单词 * q xue wan gaoji wo gei ni men jie shao dui xiang,ni men ji bu ji dong? */ public class RegexCase { public static void main(String[] args) { // 定义字符串 String string = "q xue wan gaoji wo gei ni men jie shao dui xiang,ni men ji bu ji dong?"; // 1.创建正则表达式撇三个字符组成的单词 \\b:是边界符 String reg = "\\b[a-zA-Z]{3}\\b"; Pattern compile = Pattern.compile(reg); Matcher matcher = compile.matcher(string); // find() 查找 与正则匹配的字符序列 while(matcher.find()){ // 开始的索引/偏移量 int start = matcher.start(); // 接收的索引/偏移量 int end = matcher.end(); // 获取到查询的这一组数据 String group = matcher.group(); System.out.println(start+" "+group+" "+end); } } }
-
替换功能
package day15; /* * 替换功能 * public String replaceAll(String regex,String replacement) * 使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串 */ public class RegexReplaceAll { public static void main(String[] args) { // 定义一个字符串 String str = "riroekjrghjir493t8"; // 需求:去掉所有的数字,用*替换 String reg = "\\d"; // 将单个数字替换成一个指定的字符 //String reg = "\\d+"; // 将一组数字替换成一个指定的字符 String string = str.replaceAll(reg, "*"); System.out.println(string); } }
-
分割功能
package day15; import java.util.Scanner; /* * 分割功能 * public String[] split(String regex) * 根据给定的正则表达式匹配此字符串 */ public class RegexSplit { public static void main(String[] args) { // 给定一个年龄范围 String ages = "18-24"; String reg = "-"; String[] split = ages.split(reg); for (int i = 0; i < split.length; i++) { System.out.println(split[i]); } int startAge = Integer.parseInt(split[0]); int endAge = Integer.parseInt(split[1]); // 键盘录入年龄 System.out.println("先输入你的年龄:"); Scanner scanner = new Scanner(System.in); int age = scanner.nextInt(); if(age >=startAge && age <=endAge){ System.out.println("可以培养培养!"); }else{ System.out.println("你是个好人!"); } } }