大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: 使用正则表示式(Regular expression)

如果您查询J2SE 1.4之后String的线上API手册说明,您会发现有matches()、replaceAll()等方法,您所传入的参数是“正则表示式”(Regular expression)的字符串,正则表示式的功能是J2SE 1.4之后加入的新功能。

正则表示式最早是由数学家Stephen Kleene于1956年提出,主要使用在字节字符串的格式比对,后来在信息领域广为应用,现在已经成为ISO(国际标准组织)的标准之一。

Java在J2SE 1.4之后开始支持正则表示式,您可以在API文件的 java.util.regex.Pattern 类中找到支持的正则表示式相关信息。

如果您使用String类来配置字符串对象,您可以使用简易的方法来使用正则表示式,并应用于字符串的比对或取代等动作上,以下先介绍几个简单的正则表示式。

例如一些常用的范围,我们可以使用预先定义的字节类:

. 符合任一字节
\d 等于 [0-9] 数字
\D 等于 [^0-9] 非数字
\s 等于 [ \t\n\x0B\f\r] 空白字节
\S 等于 [^ \t\n\x0B\f\r] 非空白字节
\w 等于 [a-zA-Z_0-9] 数字或是英文字
\W 等于 [^a-zA-Z_0-9] 非数字与英文字


. 符合任一字节。例如有一字符串abcdebcadxbc,使用.bc来比对的话,符合的子字符串有abc、ebc、xbc三个;如果使用..cd,则符合的子字符串只有bcd。

以上的例子来根据字节比对,您也可以使用“字节类”(Character class)来比较一组字节范围,例如:


[abc] a、b或c
[^abc] 非a、b、c的其它字节
[a-zA-Z] a到z或A到Z(范围)
[a-d[m-p]] a到d或m到p(联集)
[a-z&&[def]] d、e或f(交集)
[a-z&&[^bc]] a到z,除了b与c之外(减集)
[a-z&&[^m-p]] a到z且没有m到p(a-lq-z)(减集)










一次只指定一个字节不过瘾,也可以用Greedy quantifiers来指定字节可能出现的次数:

X? X出现一次或完全没有
X* X出现零次或多次
X+ X出现一次或多次
X{n} X出现n次
X{n,} X出现至少n次
X{n,m} X出现至少n次,但不超过m次


另外还有Reluctant quantifiersPossessive quantifiers等的指定,您可以自行引用 java.util.regex.Pattern 类中的说明。

在String类中,matches()方法可以让您验证字符串是否符合指定的正规表示式,这通常用于验证使用者输入的字符串数据是否正确,例如 电话号码格式;replaceAll()方法可以将符合正规表示式的子字符串置换为指定的字符串;split()方法可以让您依指定的正规表示式,将符合的子 字符串分离出来,并以字符串数组传回。


下面这个程序示范几个正则表示式的应用:

  • UseRegularExpression.java
import java.util.Scanner;

public class UseRegularExpression {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);

String str = "abcdefgabcabc";
System.out.println(str.replaceAll(".bc", "###"));

System.out.print("输入手机号码: ");
str = scanner.next();

// 简单格式验证
if(str.matches("[0-9]{4}-[0-9]{6}"))
System.out.println("格式正确");
else
System.out.println("格式错误");

System.out.print("输入href标签: ");
// Scanner的next()方法是以空白为区隔
// 我们的输入有空白,所以要执行两次
str = scanner.next() + " " + scanner.next();

// 验证href标签
if(str.matches("<a.+href*=*['\"]?.*?['\"]?.*?>"))
System.out.println("格式正确");
else
System.out.println("格式错误");

System.out.print("输入电子邮件: ");
str = scanner.next();

// 验证电子邮件格式
if(str.matches(
"^[_a-z0-9-]+([.][_a-z0-9-]+)*@[a-z0-9-]+([.][a-z0-9-]+)*$"))
System.out.println("格式正确");
else
System.out.println("格式错误");
}
}

执行结果:
 ###defg######
 输入手机号码: 0988-100432
 格式正确
 输入href标签: <a href="http://caterpillar.onlyfun.net">
 格式正确
 输入电子邮件: justin@caterpillar.onlyfun.net
 格式正确


最后两个href标签与email验证例子是很常见的正规表示式应用,您可以仔细看看以了解如何比对,并不会特别困难。