正则表达式@H_502_3@
@H_502_3@
@H_502_3@
在项目中。比如说表单提交,对邮箱,手机号码要进行校验,这时候正则表达式就派上用场了,我们可以用它方便的帮我们判断某个邮箱或者QQ号是否正确,只不过
用正则表达式的校验属于前端校验,在服务器端我们的校验还是必须的,那么你可能要说了,既然服务器端的校验是必须的,那前端校验的存在有必要吗?有!前端校验
可以过滤掉一些不符合规格的用户信息,大大减轻了服务器的工作负担,所以正则表达式的学习还是十分重要的。
@H_502_3@
@H_502_3@
第一部分--传统校验方式@H_301_28@
需求:@H_502_3@ 校验qq号码.@H_502_3@ 1:要求必须是5-15位数字@H_502_3@ 2:0不能开头@H_502_3@ @H_502_3@ @H_502_3@ 实现:@H_502_3@
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}"); } }是不是发现简化了很多啊,现在我们来具体学习一下正则表达式吧。。。 @H_502_3@
第二部分--正则表达式规则@H_301_28@
A:字符@H_502_3@ x 字符 x。举例:'a'表示字符a@H_502_3@ \\ 反斜线字符。因为\具有转义作用,所以在正则表达式中两个\才能表示一个\@H_502_3@ \n 新行(换行)符 ('\u000A')@H_502_3@ \r 回车符 ('\u000D')@H_502_3@ @H_502_3@ B:字符类@H_502_3@ [abc] a、b 或 c(简单类) 不能匹配ab,ac等多个字符@H_502_3@ [^abc] 任何字符,除了 a、b 或 c(否定)@H_502_3@ [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)@H_502_3@ [0-9] 0到9的字符都包括@H_502_3@ @H_502_3@ C:预定义字符类@H_502_3@ . 任何字符。我的就是.字符本身,怎么表示呢? \.@H_502_3@ \d 数字:[0-9]@H_502_3@ \w 单词字符:[a-zA-Z_0-9]@H_502_3@ 在正则表达式里面组成单词的东西必须有这些东西组成@H_502_3@ @H_502_3@ @H_502_3@ D:边界匹配器@H_502_3@ ^ 行的开头@H_502_3@ $ 行的结尾@H_502_3@ \b 单词边界@H_502_3@ 就是不是单词字符的地方。@H_502_3@ 举例:hello world?haha;xixi@H_502_3@ @H_502_3@ E:Greedy 数量词@H_502_3@ X? X,一次或一次也没有@H_502_3@ X* X,零次或多次@H_502_3@ X+ X,一次或多次@H_502_3@ X{n} X,恰好 n 次@H_502_3@ X{n,} X,至少 n 次@H_502_3@ X{n,m} X,至少 n 次,但是不超过 m 次
@H_502_3@
@H_502_3@
说明:上面的这些规则重在理解,当然一些常用的也要记忆。
@H_502_3@
第三部分--正则表达式功能@H_301_28@
@H_502_3@
1:判断功能@H_502_3@ String类的public boolean matches(String regex)@H_502_3@ 2:分割功能@H_502_3@ String类的public String[] split(String regex)@H_502_3@ 3:替换功能@H_502_3@ String类的public String replaceAll(String regex,String replacement)@H_502_3@ 4:获取功能@H_502_3@ Pattern和Matcher@H_502_3@ Pattern p = Pattern.compile("a*b");@H_502_3@ Matcher m = p.matcher("aaaaab");@H_502_3@ @H_502_3@ find():查找存不存在@H_502_3@ group():获取刚才查找过的数据@H_502_3@ @H_502_3@ 这就是正则表达式的四个功能,下面详细讲解每个功能
@H_502_3@
@H_502_3@
1、判断功能
String类的public boolean matches(String regex)@H_502_3@ 需求1:判断手机号码是否符合要求?@H_502_3@ 分析:@H_502_3@ * A:键盘录入手机号码@H_502_3@ * B:定义手机号码的规则@H_502_3@ * 13436975980@H_502_3@ * 13688886868@H_502_3@ * 13866668888@H_502_3@ * 13456789012@H_502_3@ * 13123456789@H_502_3@ * 18912345678@H_502_3@ * 18886867878@H_502_3@ * 18638833883@H_502_3@ * C:调用功能,判断即可@H_502_3@ * D:输出结果@H_502_3@
@H_502_3@
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);
}
}
@H_502_3@ 需求2:校验邮箱是否符合要求?
@H_502_3@ 分析:
@H_502_3@ *
A:键盘录入邮箱
@H_502_3@ *
B:定义邮箱的规则
@H_502_3@ *
12345678@qq.com
@H_502_3@ *
lisi@163.com
@H_502_3@ *
zhangsan@126.com
@H_502_3@ *
wangwu@sina.com.cn
@H_502_3@ *
xxx@itcast.cn
@H_502_3@ *
C:调用功能,判断即可
@H_502_3@ *
D:输出结果
@H_502_3@
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);
}
}
@H_502_3@
2、分割功能
String类的public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。@H_502_3@ 需求1:你在QQ上搜索好友,要求性别:女、年龄范围:"18-24"@H_502_3@
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");
}
}
}
@H_502_3@ 需求2:字符串分割
@H_502_3@
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:\\JavaSE\\day14\\avi";
String[] str4Array = s4.split("\\\\");
for (int x = 0; x < str4Array.length; x++) {
System.out.println(str4Array[x]);
}
System.out.println("---------------------");
}
}
@H_502_3@
3、替换功能
String类的public String replaceAll(String regex,String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。@H_502_3@
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);
}
}
@H_502_3@
4、 获取功能
Pattern和Matcher类的使用,模式和匹配器的基本使用顺序@H_502_3@ @H_502_3@ Pattern:正则表达式的编译表示形式。 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,@H_502_3@ 依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。@H_502_3@ @H_502_3@ 因此,典型的调用顺序是@H_502_3@ @H_502_3@ Pattern p = Pattern.compile("a*b");@H_502_3@ Matcher m = p.matcher("aaaaab");@H_502_3@ boolean b = m.matches();在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句@H_502_3@ boolean b = Pattern.matches("a*b","aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。@H_502_3@
@H_502_3@
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);
}
}
@H_502_3@ 需求1:获取功能::获取下面这个字符串中由三个字符组成的单词
@H_502_3@ da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
@H_502_3@
public class RegexDemo {
public static void main(String[] args) {
// 定义字符串
String s = "da jia ting wo shuo,gao xing bu?";
// 规则
String regex = "\\b\\w{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);
}
}
好啦,这就是正则表达式的基本功能了。。。。。
@H_502_3@
1:判断功能@H_502_3@ String类的public boolean matches(String regex)@H_502_3@ 2:分割功能@H_502_3@ String类的public String[] split(String regex)@H_502_3@ 3:替换功能@H_502_3@ String类的public String replaceAll(String regex,String replacement)@H_502_3@ 4:获取功能@H_502_3@ Pattern和Matcher@H_502_3@ Pattern p = Pattern.compile("a*b");@H_502_3@ Matcher m = p.matcher("aaaaab");@H_502_3@ @H_502_3@ find():查找存不存在@H_502_3@ group():获取刚才查找过的数据@H_502_3@ @H_502_3@ 这就是正则表达式的四个功能,下面详细讲解每个功能
@H_502_3@
@H_502_3@
1、判断功能
String类的public boolean matches(String regex)@H_502_3@ 需求1:判断手机号码是否符合要求?@H_502_3@ 分析:@H_502_3@ * A:键盘录入手机号码@H_502_3@ * B:定义手机号码的规则@H_502_3@ * 13436975980@H_502_3@ * 13688886868@H_502_3@ * 13866668888@H_502_3@ * 13456789012@H_502_3@ * 13123456789@H_502_3@ * 18912345678@H_502_3@ * 18886867878@H_502_3@ * 18638833883@H_502_3@ * C:调用功能,判断即可@H_502_3@ * D:输出结果@H_502_3@
@H_502_3@
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); } }@H_502_3@ 需求2:校验邮箱是否符合要求? @H_502_3@ 分析: @H_502_3@ * A:键盘录入邮箱 @H_502_3@ * B:定义邮箱的规则 @H_502_3@ * 12345678@qq.com @H_502_3@ * lisi@163.com @H_502_3@ * zhangsan@126.com @H_502_3@ * wangwu@sina.com.cn @H_502_3@ * xxx@itcast.cn @H_502_3@ * C:调用功能,判断即可 @H_502_3@ * D:输出结果 @H_502_3@
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); } }@H_502_3@
2、分割功能
String类的public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。@H_502_3@ 需求1:你在QQ上搜索好友,要求性别:女、年龄范围:"18-24"@H_502_3@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"); } } }@H_502_3@ 需求2:字符串分割 @H_502_3@
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:\\JavaSE\\day14\\avi"; String[] str4Array = s4.split("\\\\"); for (int x = 0; x < str4Array.length; x++) { System.out.println(str4Array[x]); } System.out.println("---------------------"); } }@H_502_3@
3、替换功能
String类的public String replaceAll(String regex,String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。@H_502_3@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); } }@H_502_3@
4、 获取功能
Pattern和Matcher类的使用,模式和匹配器的基本使用顺序@H_502_3@ @H_502_3@ Pattern:正则表达式的编译表示形式。 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,@H_502_3@ 依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。@H_502_3@ @H_502_3@ 因此,典型的调用顺序是@H_502_3@ @H_502_3@ Pattern p = Pattern.compile("a*b");@H_502_3@ Matcher m = p.matcher("aaaaab");@H_502_3@ boolean b = m.matches();在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句@H_502_3@ boolean b = Pattern.matches("a*b","aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。@H_502_3@
@H_502_3@
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); } }@H_502_3@ 需求1:获取功能::获取下面这个字符串中由三个字符组成的单词 @H_502_3@ da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu? @H_502_3@
public class RegexDemo { public static void main(String[] args) { // 定义字符串 String s = "da jia ting wo shuo,gao xing bu?"; // 规则 String regex = "\\b\\w{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); } }好啦,这就是正则表达式的基本功能了。。。。。