Java从零开始学三十二(正则表达式)
一、为什么要有正则
正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证、拆份、替换功能。
例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法:
不使用正则完成
使用正则完成
二、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)
|
普通
|
字符串拆分
|