本篇文章是学习尚学堂的关于正则表达式的视频教程时,所做的笔记。供广大编程爱好者学习之用,也留给日后自己复习使用!
1.为什么要有正则表达式?
正则表达式可以方便的对数据进行匹配,可以进行更加复杂的字符串验证、拆分、替换功能。
例如,现在要判断一个字符串是否全部由数字构成,若不使用正则表达式,代码如下:
public static boolean isAllNum(String string){
char[] charArr = string.toCharArray();
for(char tempC : charArr){
if(tempC < '0' || tempC > '9') //判断每个字符是否在'0'~'9'之间
return false;
}
return true;
}
现在仅仅判断字符串是不是只由数字组成,如果稍微复杂一点,则代码将会更加庞大。
如果使用正则表达式,代码如下:
public static boolean isAllNum2(String string){
if(Pattern.compile("[0-9]+").matcher(string).matches())
return true;
else
return false;
}
对于使用正则表达式的方法,其关键代码也就一行,即第二行。两段代码对比一下便会发现使用正则表达式的优势,特别是在对字符串处理逻辑比较复杂的时候,正则表达式的优势会更加突出。(代码的详细讲解我会在接下来的文章中慢慢道来O(∩_∩)O)。
2.Pattern类和Mattern类
Pattern类为正则表达式的编译表示形式,指定为字符串的正则表达式必须首先被编译为此类的实例,然后就可以将得到的模式用于创建一个Matcher对象。
Matcher为一个解释器,通过解释Pattern对正则表达式的匹配,然后调用matches方法获取匹配的结果。大家可能看得有点模糊,其实其基本的操作流程为:
Pattern p = Pattern.compile
("[0-9]+"); //参数为正则表达式 Matcher m = p.matcher
("aaaaab"); //参数为待匹配的字符序列 boolean b = m.matches
(); //返回匹配结果
简写的形式也就是第一个例子中的形式:Pattern.compile(“正则表达式”).matcher(“待匹配的数据”).matches();
Pattern类中最常用的方法为:String[] strArr = split(CharSequence string);该方法用于将字符串string按照正则表达式的规则进行拆分,将拆分后的字符数组返回。
Matcher类中常用的方法:public boolean matches();//进行字符串的验证
public String replaceAll(String replacement);//进行字符串的替换
3.常用的正则规则
关于字符出现次数的问题(X表示一组规范):
举个例子:
例如:Pattern.compile("[0-9]").matcher(“123”).matches();
用[0-9]匹配字符串”123”的话,则结果返回false,因为[0-9]为一组规范,而之后什么都没有的话,则表示必须只出现一次,所以它匹配的字符串只能是一个字符,只有将字符串”123”改为”1”,则返回结果为true。
例如使用正则:[0-9]?,如果用这个正则去匹配一个空的字符串:””,返回结果为true,因为X?表示可以出现0次或者1次。
因此使用[0-9]+,则可以匹配任意大小的字符串。
再举个例子:使用正则表达式:[0-9]{2,},则这个正则表达式匹配的字符串只有其长度大于或等于2,并且字符串全部由数字组成才返回true;
例如我们在网上注册用户的时候,网站要求用户名为6-9位数字或字母,则可以使用正则[a-zA-Z0-9]{6,9}进行匹配。
关于逻辑运算符(X,Y表示一组规范)
为了帮助理解,下面用几个例子来验证一下上面的正则表达式规则:
例1:验证一个字符串是否是一个合法的日期格式(yyyy-MM-dd);
因为年为4为整数,月和日都为两位整数,中间用“-”号来分隔,因此正则表达式可以为:
”\\d{4}-\\d{2}-\\d{2}”
因为\d中的斜杠\不是转义字符,因此需要将其进行转义,故要两个斜杠
代码如下:
public static boolean isDate(String string){
String regex = "\\d{4}-\\d{2}-\\d{2}"; //正则规则
Pattern p = Pattern.compile(regex); //创建Pattern对象,对正则进行编译
Matcher m = p.matcher(string); //创建Matcher对象
return m.matches();
}
例2:将字符串"Pairs32London0Beijing7893Hangzhou"中的英文单词拆分出来
代码如下;
//由字符串我们可以看出来,引文字符被数字分隔开来了,因此我们只要将数字当做分隔符即可
String str = "Pairs32London0Beijing7893Hangzhou";
Pattern p = Pattern.compile("\\d+");
String[] strArr = p.split(str);
for(String tempStr : strArr){
System.out.println(tempStr);
}
拆分结果为:
例3:将字符串“A B C D”中的所有空格替换为下划线”_”
代码如下:
/**
* 将字符串"A B C D"中的空格替换为下划线"_"
*/
public static void test2(){
String string = "A B C D";
String regex = "\\s";//匹配所有的空白字符,包括空格和换行
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(string);
System.out.println(matcher.replaceAll("_"));
}
4.String类对正则表达式的支持
在JDK1.4之后,Java对正则进行了一些扩充,在String类中开始直接支持正则的操作。
例如将“haha1heihei123xixi0”字符串中的所有数字替换为下滑线”_”:
String str = "haha1heihei123xixi0";
str = str.replaceAll("\\d+", "_");
System.out.println(str);
5.总结
1).使用正则可以方便的完成字符串的验证、拆分、替换等复杂功能。
2).在开发中一般都会直接使用String类中提供好的正则支持,而往往很少直接使用Pattern类和Matcher类
3).在正则应用的时候,对于一些敏感的字符要使用斜杠\转义。