Java常用类库——正则表达式

学习目标

掌握正则表达式的作用
掌握正则表达式的匹配模式
掌握Pattern类和Matcher类的使用
掌握String对正则的支持

为什么要有正则

正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证、拆分、替换功能。
例如:现在要求判断一个字符串是否由数字组成,则可以有以下两种做法:
不使用正则完成
使用正则完成
以验证字符串是否由数字组成为例:
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("不是由数字组成!") ;
		}
	}
};
基本思路:就是将字符串拆分,之后一个个的进行比较验证,但是非常麻烦,况且现在验证的只是数字,如果更加复杂的就无法想象了。
此时,如果将代码换成正则表达式,再观察效果:
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("不是由数字组成!") ;
		}
	}
};

以上的代码也完成了字符串的验证功能,可以发现,使用此种验证方法比之前的操作代码更加简单。
历史发展:
   正则在JDK1.4之后被引入到Java之中,最早时候的JDK,如果要想使用正则,则需要单独安装Apache提供的一个正则开发包。

Pattern、Matcher类

这两个类为正则的核心操作类。这两个类都定义在 java.util.regex 包中。
Pattern类的主要作用是进行正则规范的编写,而Matcher类主要是执行规范,验证一个字符串是否符合其规范。
常用的正则规则如下:

\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(String regex)      指定正则表达式规则
public Matcher matcher(CharSequence input)  返回Matcher类的实例
public String[] split(CharSequence input)      字符串拆分
在Pattern类中如果要想取得Pattern类实例,则必须调用compile()方法。
本类中没有明确的构造方法可以供用户使用,那么则肯定此类的构造方法被私有化了,则可以直接从Pattern类中取得本类的实例。
指定好操作的正则:public static Pattern compile(String regex)
可以为matcher类实例化:public Matcher matcher(CharSequence input)
拆分: public String[] split(CharSequence input)   回顾:在String中也存在拆分操作。

Matcher类的常用方法。
如果要验证一个字符串是否符合规范,则可以使用Matcher类。
public boolean matches() 执行验证
public String replaceAll(String replacement) 字符串替换
进行字符串的验证: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 = "1993-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类除了可以通过返回Matcher类对象进行正则验证外,还可以使用正则进行字符串的拆分功能。
代码如下:
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) ;
	}
};

只要使用正则验证的规则,那么就可以匹配各种复杂的字符串。

String对正则表达式的支持

在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 = "LX:98|HHXY:90|NAN:100" ;			// 定义一个字符串
		// 拆分的形式:
		/*
			LX	-->	98
			HHXY	-->	90
			NAN	-->	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、在一些正则应用开发时,对于一些敏感的字符要进行转义操作。
4、至于捕获组的内容还没有进行研究,直接查看API文档即可。


你可能感兴趣的:(Java常用类库——正则表达式)