正则表达式
正则表达式本质上是一种字符串操作语法规则,利用它我们能更加灵活地实现字符串的匹配、拆分、替换等操作。
正则标记
所有的正则表达式支持的类都定义在java.util.regex包里面。这个包里面定义了如下两个主要的类:
1.Pattern类:主要定义要使用的表达式对象
2.Matcher类:用于进行正则标记与指定内容的匹配操作。
所有可以使用的正则标记都在java.util.regex.Pattern类说明文档中定义,常用的标记有如下6类:
1.单个字符(数量:1)
- 字符:表示由一位字符组成;
- \\\:表示转义字符“\”;
- \t:表示一个“\t”符号;
- \n:表示一个“\n”符号;
2.字符集(数量:1)
- [abc]:表示可能是字符a、字符b、字符c中的任意一位;
- [^abc]:表示不是字符a,b、c中的任意一位;
- [a-z]:所有的小写字母;
- [a-zA-Z]:表示任意的一位字母,不区分大小写;
- [0-9]:表示任意的一位数字;
3.简化的字符集表达式(数量:1)
- .:表示任意的一位字符;
- \d:等价于“[0-9]”,属于简化写法;
- \D:等价于“[^0-9]”,属于简化写法;
- \s:表示任意的空白字符,例如:“\t”、“\n”;
- \S:表示任意的非空白字符;
- \w:等价于“[a-zA-Z_0-9]”,表示由任意的字母、数字、_组成;
- \W:等价于“[a-zA-Z_0-9]”,表示不是由任意的字母、数字、_组成;
4.边界分配
- ^:正则的开始;
- $:正则的结束;
5.数量表达
- 正则?:表示此正则可以出现0次或1次;
- 正则+:表示此正则可以出现1次或1次以上;
- 正则*:表示此正则可以出现0次、1次或多次;
- 正则{n}:表示此正则正好出现n次;
- 正则{n,}:表示此正则出现n次以上(包含n次);
- 正则{n,m}:表示此正则出现n~m次;
6.逻辑运算
- 正则1正则2:正则1判断完成后继续判断正则2;
- 正则1|正则2:正则1或是正则2有一组满足即可;
- (正则):将多个正则作为一组,可以为这一组单独设置出现的次数。
Pattern类常用方法
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public static Pattern compile(String regex) | 普通 | 编译正则表达式 |
2 | public String[] split(CharSequence input) | 普通 | 数据全拆分操作 |
3 | public String[] split(CharSequence input,int limit) | 普通 | 数据部分拆分操作 |
4 | public Matcher matcher(CharSequence input) | 普通 | 取得Matcher类对象 |
注意:Pattern类没有定义构造方法,所以想要取得Pattern类对象,必须利用compile()方法进行正则表达式的编译操作。同时,因为在Pattern类中定义的方法,在进行参数接收时接收的都是CharSequence接口对象,所以只要是CharSequence接口的子类都可以进行正则操作。
例:利用Pattern类实现字符串拆分
package Project.Study.PatternClass;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Test1 {
public static void main(String[]args){
String str="hello3232world32!!!";
String regex="\\d+";
Pattern pattern=Pattern.compile(regex); //编译正则
String[] result =pattern.split(str); //拆分字符串
System.out.println(Arrays.toString(result));
}
}
//结果:
//[hello, world, !!!]
Matcher类常用方法
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean matches() | 普通 | 正则匹配 |
2 | public String replaceAll(String replacement) | 普通 | 全部替换 |
3 | public String replaceFirst(String replacement) | 普通 | 替换首个 |
例:实现字符串验证操作
package Project.Study.MatcherClass;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test1 {
public static void main(String[]args){
String str="100";
String regex="\\d+";
Pattern pattern=Pattern.compile(regex); //编译正则
Matcher matcher=pattern.matcher(str); //进行正则匹配
System.out.println(matcher.matches()); //匹配结果
}
}
//结果:
//true
String类对正则的支持
事实上,在实际开发中String类使用得较多,大部分情况下都会使用String类中提供的方法来直接简化正则操作,只有很少的情况下才会使用Pattern类和Matcher类操作正则。
String类与正则有关的5个操作方法
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean matches(String regex) | 普通 | 正则验证,使用指定的字符串判断其是否符合给出的正则表达式结构 |
2 | public String replaceAll(String regex,String replacement) | 普通 | 将满足正则标记的内容全部替换为新的内容 |
3 | public String replaceFirst(String regex,String replacement) | 普通 | 将满足正则标记的首个内容替换为新的内容 |
4 | public String[] split(String regex) | 普通 | 按照指定的正则标记进行字符串的全拆分 |
5 | public String[] split(String regex,int limit) | 普通 | 按照指定的正则标记进行字符串的部分拆分 |
上面5个方法包括字符串的替换、拆分、验证操作,下面我们就来实现一下
例:实现字符串的替换
package Project.Study.Regex;
public class Test1 {
public static void main(String[]args){
String str="hel12l32o232121wQo@#rl32d!!!";//给出一组混乱的字符串
String regex="[^a-z]"; //编写正则,剔除所有不是小写字母的字符
System.out.println(str.replaceAll(regex,""));//字符串替换
}
}
//结果:
//helloworld
例:字符串的拆分
package Project.Study.Regex;
public class Test2 {
public static void main(String[]args){
String str="hello090world3241!!!";
String regex="\\d+"; //表示"[0-9]"一位以上的整数位,属于简化写法,因为是在字符串中定义的,所以用"\\"代替"\",属于转义字符操作
String[] result =str.split(regex);
for (String s : result) {
System.out.println(s); //输出分隔好的字符串
}
}
}
//结果:
//hello
//world
//!!!
正则验证的应用
若是字符串是带小数点".“的数字呢(小数点”."在正则中表示任意字符),我们又应该怎么将其转换为浮点型数据?
例:将字符型数字转换为浮点型数据
package Project.Study.Regex;
public class Test3 {
public static void main(String[]args){
String str1="10.01";
String str2="10.10";
String regex="\\d+(\\.\\d+)?";
if(str1.matches(regex)){ //转型前要进行验证
System.out.println(Double.parseDouble(str1));
}
if(str2.matches(regex)){ //转型前要进行验证
System.out.println(Double.parseDouble(str2));
}
}
}
//结果:
//10.01
//10.1
上程序中的正则解析:
上程序中的"?"表示该小数位可能出现0次或1次。
上程序中使用了matches()方法进行正则验证,同理,我们也可以用它来判断其他,例如:IP地址
例:
package Project.Study.Regex;
public class Test4 {
public static void main(String[]args){
String str1="192.168.1.1";
String str2="192.1683.1.1";
String regex1="\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";//该正则中的"\\d{1,3}"表示1~3位数字
String regex2="(\\d{1,3}\\.){3}\\d{1,3}"; //简化正则操作
System.out.println(str1.matches(regex1));
System.out.println(str1.matches(regex2));
System.out.println(str2.matches(regex1));
System.out.println(str2.matches(regex2));
}
}
//结果:
//true
//true
//false
//false
例:判断日期格式是否正确
package Project.Study.Regex;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test5 {
public static void main(String[]args) throws ParseException {
String str="2013-8-15";
String regex="\\d{4}-\\d{1,2}-\\d{1,2}"; //定义验证正则
if(str.matches(regex)){ //符合规则
Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
System.out.println(date);
}
}
}
//结果:
//Thu Aug 15 00:00:00 CST 2013