如果您查询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()方法可以让您依指定的正规表示式,将符合的子
字符串分离出来,并以字符串数组传回。
下面这个程序示范几个正则表示式的应用:
- 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验证例子是很常见的正规表示式应用,您可以仔细看看以了解如何比对,并不会特别困难。
|
|