如果您查询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 quantifiers、Possessive quantifiers等的指定,您可以自行参考 java.util.regex.Pattern 类别中的说明。
在String类别中,matches()方法可以让您验证字符串是否符合指定的正规表示式,这通常用于验证使用者输入的字符串数据是否正确,例如 电话号码格式;replaceAll()方法可以将符合正规表示式的子字符串置换为指定的字符串;split()方法可以让您依指定的正规表示式,将符合的子 字符串分离出来,并以字符串数组传回。
下面这个程序示范几个正则表示式的应用:
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标签: 格式正确 输入电子邮件: justin@caterpillar.onlyfun.net 格式正确
最后两个href标签与email验证例子是很常见的正规表示式应用,您可以仔细看看以了解如何比对,并不会特别困难。