正则表达式(基础知识)
发布时间:2020-12-14 01:14:31 所属栏目:百科 来源:网络整理
导读:正则表达式 在项目中。比如说表单提交,对邮箱,手机号码要进行校验,这时候正则表达式就派上用场了,我们可以用它方便的帮我们判断某个邮箱或者QQ号是否正确,只不过 用正则表达式的校验属于前端校验,在服务器端我们的校验还是必须的,那么你可能要说了,
正则表达式
在项目中。比如说表单提交,对邮箱,手机号码要进行校验,这时候正则表达式就派上用场了,我们可以用它方便的帮我们判断某个邮箱或者QQ号是否正确,只不过
用正则表达式的校验属于前端校验,在服务器端我们的校验还是必须的,那么你可能要说了,既然服务器端的校验是必须的,那前端校验的存在有必要吗?有!前端校验
可以过滤掉一些不符合规格的用户信息,大大减轻了服务器的工作负担,所以正则表达式的学习还是十分重要的。
第一部分--传统校验方式需求:
public class RegexDemo { public static void main(String[] args) { // 创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入你的QQ号码:"); String qq = sc.nextLine(); System.out.println("checkQQ:"+checkQQ(qq)); } /* * 写一个功能实现校验 两个明确: 明确返回值类型:boolean 明确参数列表:String qq */ public static boolean checkQQ(String qq) { boolean flag = true; // 校验长度 if (qq.length() >= 5 && qq.length() <= 15) { // 0不能开头 if (!qq.startsWith("0")) { // 必须是数字 char[] chs = qq.toCharArray(); for (int x = 0; x < chs.length; x++) { char ch = chs[x]; if (!Character.isDigit(ch)) { flag = false; break; } } } else { flag = false; } } else { flag = false; } return flag; } }用正则表达式改进后的程序 public class RegexDemo { public static void main(String[] args) { // 创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入你的QQ号码:"); String qq = sc.nextLine(); System.out.println("checkQQ:" + checkQQ(qq)); } public static boolean checkQQ(String qq) { return qq.matches("[1-9]d{4,14}"); } }是不是发现简化了很多啊,现在我们来具体学习一下正则表达式吧。。。 第二部分--正则表达式规则
A:字符
x 字符 x。举例:'a'表示字符a 反斜线字符。因为具有转义作用,所以在正则表达式中两个才能表示一个 n 新行(换行)符 ('u000A') r 回车符 ('u000D') B:字符类 [abc] a、b 或 c(简单类) 不能匹配ab,ac等多个字符 [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) [0-9] 0到9的字符都包括 C:预定义字符类 . 任何字符。我的就是.字符本身,怎么表示呢? . d 数字:[0-9] w 单词字符:[a-zA-Z_0-9] 在正则表达式里面组成单词的东西必须有这些东西组成 D:边界匹配器 ^ 行的开头 $ 行的结尾 b 单词边界 就是不是单词字符的地方。 举例:hello world?haha;xixi E:Greedy 数量词 X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好 n 次 X{n,} X,至少 n 次 X{n,m} X,至少 n 次,但是不超过 m 次
说明:上面的这些规则重在理解,当然一些常用的也要记忆。
第三部分--正则表达式功能1:判断功能 String类的public boolean matches(String regex) 2:分割功能 String类的public String[] split(String regex) 3:替换功能 String类的public String replaceAll(String regex,String replacement) 4:获取功能 Pattern和Matcher Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); find():查找存不存在 group():获取刚才查找过的数据 这就是正则表达式的四个功能,下面详细讲解每个功能 1、判断功能String类的public boolean matches(String regex)需求1:判断手机号码是否符合要求? 分析: * A:键盘录入手机号码 * B:定义手机号码的规则 * 13436975980 * 13688886868 * 13866668888 * 13456789012 * 13123456789 * 18912345678 * 18886867878 * 18638833883 * C:调用功能,判断即可 * D:输出结果 public class RegexDemo { public static void main(String[] args) { //键盘录入手机号码 Scanner sc = new Scanner(System.in); System.out.println("请输入你的手机号码:"); String phone = sc.nextLine(); //定义手机号码的规则 String regex = "1[38]d{9}"; //调用功能,判断即可 boolean flag = phone.matches(regex); //输出结果 System.out.println("flag:"+flag); } } 需求2:校验邮箱是否符合要求? 分析: * A:键盘录入邮箱 * B:定义邮箱的规则 * 12345678@qq.com * lisi@163.com * zhangsan@126.com * wangwu@sina.com.cn * xxx@itcast.cn * C:调用功能,判断即可 * D:输出结果 public class RegexTest { public static void main(String[] args) { //键盘录入邮箱 Scanner sc = new Scanner(System.in); System.out.println("请输入邮箱:"); String email = sc.nextLine(); //定义邮箱的规则 //String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(.[a-zA-Z_0-9]{2,3})+"; String regex = "w+@w{2,6}(.w{2,3})+"; //调用功能,判断即可 boolean flag = email.matches(regex); //输出结果 System.out.println("flag:"+flag); } } 2、分割功能String类的public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。需求1:你在QQ上搜索好友,要求性别:女、年龄范围:"18-24" public class RegexDemo { public static void main(String[] args) { //定义一个年龄搜索范围 String ages = "18-24"; //定义规则 String regex = "-"; //调用方法 String[] strArray = ages.split(regex); //如何得到int类型的呢? int startAge = Integer.parseInt(strArray[0]); int endAge = Integer.parseInt(strArray[1]); //键盘录入年龄 Scanner sc = new Scanner(System.in); System.out.println("请输入你的年龄:"); int age = sc.nextInt(); if(age>=startAge && age<=endAge) { System.out.println("你就是我想找的"); }else { System.out.println("不符合我的要求,gun"); } } } 需求2:字符串分割 public class RegexDemo { public static void main(String[] args) { // 定义一个字符串 String s1 = "aa,bb,cc"; // 直接分割 String[] str1Array = s1.split(","); for (int x = 0; x < str1Array.length; x++) { System.out.println(str1Array[x]); } System.out.println("---------------------"); String s2 = "aa.bb.cc"; String[] str2Array = s2.split("."); for (int x = 0; x < str2Array.length; x++) { System.out.println(str2Array[x]); } System.out.println("---------------------"); String s3 = "aa bb cc"; String[] str3Array = s3.split(" +"); for (int x = 0; x < str3Array.length; x++) { System.out.println(str3Array[x]); } System.out.println("---------------------"); //硬盘上的路径,我们应该用替代 String s4 = "E:JavaSEday14avi"; String[] str4Array = s4.split("\"); for (int x = 0; x < str4Array.length; x++) { System.out.println(str4Array[x]); } System.out.println("---------------------"); } } 3、替换功能String类的public String replaceAll(String regex,String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。public class RegexDemo { public static void main(String[] args) { // 定义一个字符串 String s = "helloqq12345worldkh622112345678java"; // 我要去除所有的数字,用*给替换掉 // String regex = "d+"; // String regex = "d"; //String ss = "*"; // 直接把数字干掉 String regex = "d+"; String ss = ""; String result = s.replaceAll(regex,ss); System.out.println(result); } } 4、 获取功能Pattern和Matcher类的使用,模式和匹配器的基本使用顺序Pattern:正则表达式的编译表示形式。 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象, 依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。 因此,典型的调用顺序是 Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句 boolean b = Pattern.matches("a*b","aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。 public class RegexDemo { public static void main(String[] args) { // 模式和匹配器的典型调用顺序 // 把正则表达式编译成模式对象 Pattern p = Pattern.compile("a*b"); // 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串 Matcher m = p.matcher("aaaaab"); // 调用匹配器对象的功能 boolean b = m.matches(); System.out.println(b); //这个是判断功能,但是如果做判断,这样做就有点麻烦了,我们直接用字符串的方法做 String s = "aaaaab"; String regex = "a*b"; boolean bb = s.matches(regex); System.out.println(bb); } } 需求1:获取功能::获取下面这个字符串中由三个字符组成的单词 da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu? public class RegexDemo { public static void main(String[] args) { // 定义字符串 String s = "da jia ting wo shuo,gao xing bu?"; // 规则 String regex = "bw{3}b"; // 把规则编译成模式对象 Pattern p = Pattern.compile(regex); // 通过模式对象得到匹配器对象 Matcher m = p.matcher(s); // 调用匹配器对象的功能 // 通过find方法就是查找有没有满足条件的子串 // public boolean find() // boolean flag = m.find(); // System.out.println(flag); // // 如何得到值呢? // // public String group() // String ss = m.group(); // System.out.println(ss); // // // 再来一次 // flag = m.find(); // System.out.println(flag); // ss = m.group(); // System.out.println(ss); while (m.find()) { System.out.println(m.group()); } // 注意:一定要先find(),然后才能group() // IllegalStateException: No match found // String ss = m.group(); // System.out.println(ss); } }好啦,这就是正则表达式的基本功能了。。。。。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |