版权声明:来自等待or进取的博客 https://blog.csdn.net/qq_39466683/article/details/82424911
目录
正则表达式
- 定义:一组特殊的字符,来描述一个字符串格式;对字符串进行复杂的操作(查找,替换,匹配)。
- 特点:不关心内容是否有效,只关注格式是否匹配。
- 作用:匹配字符串是否满足给定格式。
- 字符集合: [] 表示一个字符
[123] 表示1,2,3中的任意一个字符
[0-9] 表示0-9之间的任意一个字符
[^123] 表示除了1,2,3的任意一个字符
[a-z&&[^i-o]] 表示a-z之间的任意一个字符除了i-o之间的任意一个字符
[a-d[m-p]] 表示a到d或m到p:[a-dm-p](并集) - 数量词: X? 表示0个或1个
X* 表示0个或任意多个
X+ 表示大于等于1个
X{n} 表示n个
X{n,} 表示大于等于n
X{n,m} 表示n到m个 - 预定义字符集: . 任意一个字符
\d 任意一个数字字符,相当于[0-9]
\w 单词字符,相当于[a-zA-Z]
\s 空白字符,相当于[\t\n\x0B\f\r]
\D 非数字字符
\W 非单词字符
\S 非空白字符 - 分组"()":
()圆括号表示分组,可以将一系列正则表达式看做一个整体,分组时可以使用"|"表示或"关系"。 - ^匹配输入字符串开始的位置。 $匹配输入字符串结尾的位置。
- 方法:①matches(String regex):
告知此字符串是否匹配给定的正则表达式。
调用此方法的 str.matches(regex) 形式与Pattern.matches(regex, str)表达式产生的结果完全相同。
// [email protected] // [0-9a-zA-Z_]+@[0-9a-z-A-Z]+(\.[a-zA-Z]+)+ // \w+@\w+(\.[a-zA-Z]+)+ /* * 该方法是匹配目标字符串是否符合给定的格式要求 * * matches(String regex);boolean * 当前方法是全匹配,不加^和$,方法内部自动添加 */ String regex = "^\\w+@\\w+(\\.[a-zA-Z]+)+$";//格式 System.out.println(regex); String mail = "[email protected]"; boolean b = mail.matches(regex); System.out.println(b); // www.baidu.com // [w]{3}\.\w+(\.[a-zA-Z]+)+ regex = "[w]{3}\\.\\w+(\\.[a-zA-Z]+)+"; String edge = "www.dsa.edu.cn"; b = edge.matches(regex); System.out.println(b); // 身份证号 // \d{15}(\d{2}[0-9Xx])? // ^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$ // ^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$ /* ^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)| (^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$ */ regex = "\\d{15}(\\d{2}[0-9Xx])?"; String id = "12346218970212345X"; b = id.matches(regex); System.out.println(b); //根据符号才拆分时,连续出现该符号(该字符出现的位置在开头和中间),拆分后的结果是空字符 String str1 = ",,,,,,,a,t,,,,,,,,,,s,d,f,g,h,,,,,,,,,,,,"; String regex1 = ",";//根据逗号拆,返回string类型的数组 String[] arr = str1.split(regex1); System.out.println(Arrays.toString(arr));
②split(String regex):
根据给定正则表达式的匹配拆分此字符串。
该方法的作用就像是使用给定的表达式和限制参数0来调用两参数split方法。因此,所得数组中不包括结尾空字符串。
/* * 根据给定的字符格式来解析字符串 * split(String regex);String[] */ String str2 = ",,,,dfe,fgre,ght,hyt,g,,,,,gertgtr,,,,,,,"; String regex2 = ","; // 匹配不到的话,返回原字符串 // String regex3 = "-"; String[] s = str2.split(regex2); System.out.println(s.length); for(int i = 0;i <s.length;i++) { System.out.println(s[i]); } /*JDK里面的例子*/ String str3 = "boo:and:foo"; String regex3 = "o";//":" String[] s1 = str3.split(regex3); System.out.println(Arrays.toString(s1)); for(int i = 0;i <s1.length;i++) { System.out.println(s1[i]); }
③replaceAll(String regex, String replacement):
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
package day03; import java.util.Scanner; public class Demo2 { public static void main(String[] args) { /* * 将字符串中满足格式要求的部分内容进行替换 * replaceAll(String regex,String str);String */ String str = "123asdf123asdf123asdf"; str = str.replaceAll("\\d", "#"); System.out.println(str); System.out.println("请输入一串汉字"); Scanner scn = new Scanner(System.in); String str1 = scn.next(); str1 = str1.replaceAll("[啊哦呵哼切]", "hi"); System.out.println(str1); } }
作业:
- 编写RegExUtils类,提供静态方法实现对身份证号码、邮政编码、手机号码的合法性校验
package day03; import java.util.Scanner; public class Zuoye { //第一题 public static void main(String[] args) { // TODO Auto-generated method stub Scanner snc = new Scanner(System.in); System.out.println("请输入身份证号:"); String str = snc.next(); System.out.println(Zuoye.testId(str)); System.out.println("请输入邮政编码:"); String str1 = snc.next(); System.out.println(Zuoye.testPostal(str1)); System.out.println("请输入手机号:"); String str2 = snc.next(); System.out.println(Zuoye.testNum(str2)); } public static boolean testId(String str) { String regex = "\\d{15}(\\d{2}[0-9Xx])?"; if(str.matches(regex)) { return true; }else { return false; } } public static boolean testPostal(String str) { String regex = "\\d{6}"; if(str.matches(regex)) { return true; }else { return false; } } public static boolean testNum(String str) { String regex = "\\d{11}"; if(str.matches(regex)) { return true; }else { return false; } } }
- 重写员工类(Emp)的equals和toString方法:
在面向对象的课程中,我们曾使用过Emp类,本案例要求重写Emp类的toString方法和equals方法,详细要求如下:
1),重写Emp类的toString方法,返回Emp对象的名字、年龄、性别和工资信息,例如:张三,23,男,5000。
2),重写Emp类的equals方法,两个Emp引用变量相等的条件是名字相等。
package day03; public class Zuoye1 { //第二题 public static void main(String[] args) { // TODO Auto-generated method stub Zuoye1 z =new Zuoye1("sen",3,"male",4785); Zuoye1 z1 =new Zuoye1("bao",4,"famale",8967); System.out.println(z.toString()); System.out.println(z.equals(z1)); } private String name; private int age; private String sex; private int salary; public Zuoye1(String name, int age, String sex, int salary) { this.name = name; this.age = age; this.sex = sex; this.salary = salary; } public String toString() { return "name:" + name + "\nage:"+ age + "\nsex:"+ sex + "\nsalary:" + salary; } public boolean equals(Zuoye1 z) { return (z.name).equals(name); } }
- 输入数字字符串,转换为整数或浮点数:
用户从控制台接收一个字符串,通过程序判断该字符串是整数,还是小数。如果既不是整数也不是小数,程序输出“数字格式不正确”。package day03; import java.util.Scanner; public class Zuoye2 { //第三题 public static void main(String[] args) { // TODO Auto-generated method stub // ctrl + shift + o Scanner scn = new Scanner(System.in); System.out.println("请输入一个数字:"); String str = scn.next(); String regex = "\\d+([.]?\\d+)?"; if(str.matches(regex)) { String[] arr = str.split("\\."); if(arr.length==2) { System.out.println(str + "是小数"); }else { System.out.println(str + "是整数"); } }else { System.out.println("数字格式不正确"); } } }