正则表达式
在项目中。比如说表单提交,对邮箱,手机号码要进行校验,这时候正则表达式就派上用场了,我们可以用它方便的帮我们判断某个邮箱或者QQ号是否正确,只不过
用正则表达式的校验属于前端校验,在服务器端我们的校验还是必须的,那么你可能要说了,既然服务器端的校验是必须的,那前端校验的存在有必要吗?有!前端校验
可以过滤掉一些不符合规格的用户信息,大大减轻了服务器的工作负担,所以正则表达式的学习还是十分重要的。
第一部分--传统校验方式
需求:
校验qq号码.
1:要求必须是5-15位数字
2:0不能开头
实现:
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 次
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:\\JavaSE\\day14\\avi"; 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 = "\\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); } }好啦,这就是正则表达式的基本功能了。。。。。