首先来看个例子:
判断一个字符串是否由数字组成:
public class JudgeString {
public static void main(String[] args) throws Exception
{
if(isNumber("123")) { // 判断字符串是否有数字组成
System.out.print("由数字组成!");
}
else {
System.out.print("不是由数字组成!");
}
}
public static boolean isNumber(String str) {
char[] data = str.toCharArray();
for(char c : data) {
if(c < '0' || c > '9') {
return false;
}
}
return true;
}
}
【结果】
对于上面的例子有一个问题,这只是一个非常简单的验证,但是发现却写了21行代码,如果是一些更为复杂的验证,那么所需要编写的代码肯定更多。所以此时,代码可以简化为如下形式。
public class RegExp {
public static void main(String[] args) throws Exception
{
/* "\\d+"实际上就以属于正则表达式的概念
* 正则开发包 : java.util.regex
* 正则开发包只提供了两个操作类:Pattern,Matcher
* */
if("123".matches("\\d+")) { // 利用正则表达式判断字符串是否有数字组成
System.out.print("由数字组成!");
}
else {
System.out.print("不是由数字组成!");
}
}
}
【结果】
在程序之中出现的“\d+”实际上就属于正则表达式的概念,发现使用正则可以简化不少的程序。
在JDK 1.4之前,Java本身是不具备正则的操作支持的,如果需要使用正则,则需要通过apache下载一个正则的开发包。而到了JDK 1.4之后,Java开始支持了正则,同时给出了java.util.regex开发包,此包提供了正则的操作类,在这个包之中只提供了两个操作类:Pattern、Matcher。
可是在一般的开发之中很少去直接使用这两个类,在JDK 1.4之后对于String类进行了大量的修改,里面增加了与正则有关的操作方法,有如下几个方法是可以支持正则操作的。
正则标记
在正则操作之中,使用一系列的标记符号是一件非常重要的任务,不光是Java,只要是支持正则操作的程序,例如:JavaScript标记都是统一的。所有的标记都在java.util.regex.Pattern类提供,下面给出一些核心的正则标记:
(1)字符,表示单个字符,只能出现1位。
x :表示是一个指定的一位字符,例如:编写一个a,表示是字母a;
\\ :表示一位字符“\”,但是由于“\”有个数含义,所以使用“\\”表示一位“\”;
\n:匹配换行;
(2)字符范围,在指定的字符范围之中选1位,只能出现1位。
[abc]:表示可以是a、b、c中的任意一位;
[^abc]:表示不是a、b、c中的任意一位;
[a-zA-Z]:表示是任意一位字母(大写或小写);
[0-9]:表示是任意一位数字。
(3)简洁表达式,表示1位。
.:表示任意的一位字符;
\d:表示一位数字,等价于“[0-9]”;
\D:表示一位非数字,等价于“[^0-9]”;
\s:表示一位空格,等价于“[ \t\n\x0B\f\r]”;
\S:表示一位非空格,等价于“[…… \t\n\x0B\f\r]”;
\w:表示一位字母、数字、,等价于“[a-zA-Z0-9]”;
\W:表示一位非字母、数字、,等价于“[^a-zA-Z0-9]”;
(4)边界匹配,Java用不上。
^:表示正则的开头;
$:表示正则的结尾。
(5)数量表示,之前的正则每个符号只表示一位,如果要表示多位,则必须使用以下的数量关系。
正则?:表示此正则可以出现0次或1次;
正则+:表示此正则可以出现1次或多次;
正则*:表示此正则可以出现0次、1次或多次;
正则{n}:表示此正则出现正好n次;
正则{n,}:表示此正则出现n次以上;
正则{n,m}:表示此正则出现n ~ m次。
(6)逻辑操作。
正则1正则2:正则1之后紧跟正则2操作;
正则1|正则2:表示或的关系,有一套正则标记匹配即可;
(正则):表示按照一组来使用。
public class StringRegEx {
public static void main(String[] args) throws Exception
{
String str = "a1b22c333d4444e55555f666666g";
String regex1 = "[0-9]+"; // 数字出现一次或多次
String regex2 = "\\d+"; // 数字出现一次或多次
System.out.println(str.replaceAll(regex1, ""));
}
}
【结果】
再来看一个例子:验证邮箱格式是否正确。
/* 验证邮箱格式
*/
public class EmailValidation {
public static void main(String[] args) throws Exception
{
String strEmail = "xingyun@163.com";
String regex = "\\w+@\\w+.\\w+";
System.out.println(strEmail.matches(regex));
}
}
【结果】