一、为什么要有正则
正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证、拆份、替换功能。
例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法:
不使用正则完成
使用正则完成
二、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_][email protected][A-Za-z0-9_]+(.[A-Za-z_]{2,3}){1,2}$"; String regEx="^\\[email protected]\\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) |
普通 |
字符串拆分 |
时间: 2024-12-23 20:06:52