一、为什么要有正则
正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证、拆份、替换功能。
例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法:
不使用正则完成
使用正则完成
二、Pattern、Matcher类
如果要想在程序中应用正则表达式则必须依靠Pattern类与Matcher类,这两个类都在java.util.regex包中定义。Pattern类的主要作用是进行正则规范的编写,而Matcher类主要是执行规范,验证一个字符串是否符合其规范。
常用正则规则
No. | 规范 | 描述 | No. | 规范 | 描述 |
1 | \\ | 表示反斜线(\)字符 | 2 | \t | 表示制表符 |
3 | \n | 表示换行 | 4 | [abc] | 字符a、b或c |
5 | [^abc] | 除了a、b、c之外的任意字符 | 6 | [a-zA-Z0-9] | 表示由字母、数字组成 |
7 | \d | 表示数字 | 8 | \D | 表示非数字 |
9 | \w | 表示字母、数字、下划线 | 10 | \W | 表示非字母、数字、下划线 |
11 | \s | 表示所有空白字符(换行、空格等) | 12 | \S | 表示所有非空白字符 |
13 | ^ | 行的开头 | 14 | $ | 行的结尾 |
15 | . | 匹配除换行符之外的任意字符 |
|
|
|
数量表示(X表示一组规范)
No. | 规范 | 描述 | No. | 规范 | 描述 |
1 | X | 必须出现一次 | 2 | X? | 可以出现0次或1次 |
3 | X* | 可以出现0次、1次或多次 | 4 | X+ | 可以出现1次或多次 |
5 | X{n} | 必须出现n次 | 6 | X{n,} | 必须出现n次以上 |
7 | X{n,m} | 必须出现n~m次 |
|
|
|
逻辑运算符(X、Y表示一组规范)
No. | 规范 | 描述 | No. | 规范 | 描述 |
1 | XY | X规范后跟着Y规范 | 2 | X | Y | X规范或Y规范 |
3 | (X) | 做为一个捕获组规范 |
|
|
|
Pattern类的常用方法
No. | 方法 | 类型 | 描述 |
1 | public static Pattern compile(String regex) | 普通 | 指定正则表达式规则 |
2 | public Matcher matcher(CharSequence input) | 普通 | 返回Matcher类实例 |
3 | public String[] split(CharSequence input) | 普通 | 字符串拆分 |
在Pattern类中如果要想取得Pattern类实例,则必须调用compile()方法。
Matcher类的常用方法
No. | 方法 | 类型 | 描述 |
1 | public boolean matches() | 普通 | 执行验证 |
2 | public String replaceAll(String replacement) | 普通 | 字符串替换 |
如果要验证一个字符串是否符合规范,则可以使用Matcher类
三、正则验证
3.1、验证字符组成
package com.pb.demo2;import java.util.regex.Pattern;public class RegexDemo1 { public static void main(String[] args) { String str="1234567890"; //声明字符串由数字组成 //使用正则验证 if(Pattern.compile("[0-9]+").matcher(str).matches()){ System.out.println("数字组成。"); }else{ System.out.println("不全是由数字组成。"); } }}
3.2、验证一字符串是否是合法日期格式
package com.pb.demo2;import java.util.regex.Matcher;import java.util.regex.Pattern;/* * 验证一字符串是否是合法日期格式 */public class RegexDemo2 { public static void main(String[] args) { String str="1983-07-23"; String pat="\\d{4}-\\d{1,2}-\\d{1,2}"; //定义规则 Pattern p=Pattern.compile(pat); //实例化pattern类对象 Matcher m=p.matcher(str); //验证字符串内容是否合法 //使用正则验证 if(m.matches()){ System.out.println("日期格式合法! !"); }else{ System.out.println("日期格式不合法! !"); } }}
3.3、按照字符串的数字将字符串拆分
package com.pb.demo2;import java.util.regex.Matcher;import java.util.regex.Pattern;/* * 按照字符串的数字将字符串拆分 */public class RegexDemo2 { public static void main(String[] args) { String str="A1B22C333D4444E55555F6G77"; String pat="\\d+"; //定义拆分的规则 Pattern p=Pattern.compile(pat); //实例化Pattern类 String [] ss=p.split(str); //拆分为字符串数组 //遍历 for (String s : ss) { System.out.print(s+"\t"); } }}
结果:
A B C D E F G
3.4、替换操作
package com.pb.demo2;import java.util.regex.Matcher;import java.util.regex.Pattern;/* * 按照字符串的数字将字符串替换 */public class RegexDemo4 { public static void main(String[] args) { String str="A1B22C333D4444E55555F6G77"; String pat="\\d+"; //定义替换的规则 Pattern p=Pattern.compile(pat); //实例化Pattern类 Matcher m=p.matcher(str); //实例化Matcher类 String newStrirng=m.replaceAll("_");//替换的字符 System.out.println(newStrirng); }}
结果:
A_B_C_D_E_F_G_
3.5、邮箱验证
package com.pb.demo2;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;/* * 邮箱是否合法 */public class RegexDemo5 { public static void main(String[] args) { Scanner input=new Scanner(System.in); //String pat="^[A-Za-z0-9_]+@[A-Za-z0-9_]+(.[A-Za-z_]{2,3}){1,2}$"; String regEx="^\\w+@\\w+(.[A-Za-z_]{2,3}){1,2}$"; System.out.println("输入邮箱:"); String email=input.nextLine(); Pattern p=Pattern.compile(regEx); Matcher m=p.matcher(email); if(m.matches()){ System.out.println("邮箱合法!!"); }else{ System.out.println("邮箱不合法!!"); } }}
四、String对正则表达式的支持
在String类中有以下三个方法是支持正则操作
No. | 方法 | 类型 | 描述 |
1 | public boolean matches(String regex) | 普通 | 字符串匹配 |
2 | public String replaceAll(String regex,String replacement) | 普通 | 字符串替换 |
3 | public String[] split(String regex) | 普通 | 字符串拆分 |