为什么要有正则
正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证、拆分、替换功能。
例如:现在要求判断一个字符串是否由数字组成,则可以有以下两种做法:
1.不使用正则完成
2.使用正则完成
1.以验证字符串是否由数字组成为例:
public class RegexDemo01{ public static void main(String args[]){ String str = "1234567890" ; // 此字符串由数字组成 boolean flag = true ; // 定义一个标记变量 // 要先将字符串拆分成字符数组,之后依次判断 char c[] = str.toCharArray() ; // 将字符串变为字符数组 for(int i=0;i<c.length;i++){ // 循环依次判断 if(c[i]<'0'||c[i]>'9'){ // 如果满足条件,则表示不是数字 flag = false ; // 做个标记 break ; // 程序不再向下继续执行 } } if(flag){ System.out.println("是由数字组成!") ; }else{ System.out.println("不是由数字组成!") ; } } };基本思路:就是将字符串拆分,之后一个个的进行比较的验证,但是这样比较麻烦,而且现在只是验证是否由数字组成,如果更加复杂的呢?
此时,如果将代码换成正则表达式,再观察效果:
2:认识正则
import java.util.regex.Pattern ; public class RegexDemo02{ public static void main(String args[]){ String str = "1234567890" ; // 此字符串由数字组成 if(Pattern.compile("[0-9]+").matcher(str).matches()){ // 使用正则 System.out.println("是由数字组成!") ; }else{ System.out.println("不是由数字组成!") ; } } };以上的代码也完成了字符串的验证功能,可以发现,使用此种验证方法比之前的操作代码更加简单。
这两个类为正则的核心操作类。
\d:表示数字,[0-9]
\D:表示非数字,[^0-9]
\w:表示字母、数字、下划线,[a-zA-Z0-9]
\W:[^a-zA-Z0-9]
以上的正则,如果要想驱动起来,则必须依靠Pattern 类和Matcher 类。
Pattern 主要表示一个规则的意思,即:正则表达式的规则需要Pattern 类中使用。
Matcher 类主要表示使用Pattern 指定好的验证规则。
本类 中没有明确的构造方法可以供用户使用,那么则肯定上类的构造方法被私有化了,则可以直接从Pattern 类中取得本类的实例。
指定好操作的正则: public static Pattern compile(Stringregex)
可以为matcher 类实例化: public Matcher matcher(CharSequence input)
拆分: public String[] split(CharSequence input)
回顾:String 中也存在拆分操作。
进行字符串的验证: public boolean matches()
字符串替换: public String replaceAll(String replacement)
与String 中相同。
import java.util.regex.Pattern ; import java.util.regex.Matcher ; public class RegexDemo03{ public static void main(String args[]){ String str = "1983-07-27" ; // 指定好一个日期格式的字符串 String pat = "\\d{4}-\\d{2}-\\d{2}" ; // 指定好正则表达式 Pattern p = Pattern.compile(pat) ; // 实例化Pattern类 Matcher m = p.matcher(str) ; // 实例化Matcher类 if(m.matches()){ // 进行验证的匹配,使用正则 System.out.println("日期格式合法!") ; }else{ System.out.println("日期格式不合法!") ; } } };
读者可以自行使用以下的方式:不使用正则验证。
在Pattern 类中也可以使用正则进行字符串的拆分功能。
import java.util.regex.Pattern ; import java.util.regex.Matcher ; public class RegexDemo04{ public static void main(String args[]){ // 要求将里面的字符取出,也就是说按照数字拆分 String str = "A1B22C333D4444E55555F" ; // 指定好一个字符串 String pat = "\\d+" ; // 指定好正则表达式 Pattern p = Pattern.compile(pat) ; // 实例化Pattern类 String s[] = p.split(str) ; // 执行拆分操作 for(int x=0;x<s.length;x++){ System.out.print(s[x] + "\t") ; } } };
还可以使用Matcher 类中的字符串替换功能。
范例:将字符串中的全部数字替换成 “_”
import java.util.regex.Pattern ; import java.util.regex.Matcher ; public class RegexDemo05{ public static void main(String args[]){ // 要求将里面的字符取出,也就是说按照数字拆分 String str = "A1B22C333D4444E55555F" ; // 指定好一个字符串 String pat = "\\d+" ; // 指定好正则表达式 Pattern p = Pattern.compile(pat) ; // 实例化Pattern类 Matcher m = p.matcher(str) ; // 实例化Matcher类的对象 String newString = m.replaceAll("_") ; System.out.println(newString) ; } };只要使用正则的验证的规则,那么就可以匹配各种复杂的字符串。
4.String 类对正正则的支持
从之前的操作中,可以发现,很多的代码除了要求的字符串不同,使用正则规则不同,基本就没什么特别的了。
所以在JDK1.4之后,Java 对正则进行了一些扩充,在String 中开始直接支持正则的操作。
import java.util.regex.Pattern ; import java.util.regex.Matcher ; public class RegexDemo06{ public static void main(String args[]){ String str1 = "A1B22C333D4444E55555F".replaceAll("\\d+","_") ; boolean temp = "1983-07-27".matches("\\d{4}-\\d{2}-\\d{2}") ; String s[] = "A1B22C333D4444E55555F".split("\\d+") ; System.out.println("字符串替换操作:" + str1) ; System.out.println("字符串验证:" + temp) ; System.out.print("字符串的拆分:") ; for(int x=0;x<s.length;x++){ System.out.print(s[x] + "\t") ; } } };
但是,在使用正则的进修有一点是需要特别注意的。
现在, 假设有如下一个字符串的拆分程序:
import java.util.regex.Pattern ; import java.util.regex.Matcher ; public class RegexDemo07{ public static void main(String args[]){ String info = "LXH:98|MLDN:90|LI:100" ; // 定义一个字符串 // 拆分的形式: /* LXH --> 98 MLDN --> 90 LI --> 100 */ String s[] = info.split("\\|") ; System.out.println("字符串的拆分:") ; for(int x=0;x<s.length;x++){ String s2[] = s[x].split(":") ; System.out.println(s2[0] + "\t" + s2[1]) ; } } };
如果有时候发现一个字符无法按照指定的字符拆分的话,则需要使用“\”转义,转义的时候两个“\”表示一个"\"。
总结:
1.使用正则可以方便的完成字符串的验证、拆分、替换等复杂功能。
2.在开发中一般都会直接使用 String 类中提供好的正则支持,而往往很少直接使用 Pattern 类或 Matcher 类。
3.在一些正则 应用的时候,对于一些敏感的字符要进行转义操作。