本文开始:
- 本书大部分内容来自《java程序设计实践教程》(2011年1月第1版)
正则表达式被许多编程语言及脚本所支持,他可以极大简化对字符串的查找、模式匹配等工作。许多java String类型的字符串斗殴支持将正则表达式作为其参数。很多情况下我们都可以使用正则表达式来完成非常复杂的工作。
例一、我们出于对用于隐私保密性原则,会对用户的电话号码做一个信息保护。将一部分号码使用"*"或"x"来表示用户的电话号码。如果这个号码是8位数,且中间还有一个"-"作为连接符号。
解决方法一:使用纯java逻辑代码来实现
那么在java中要查找这样的字符,通常需要对字符串进行逐一识别。如果当前字符是一个字符,那么程序需要记载下这个字符的属性(位置),并继续判断后面连续的4个字符是不是为数字;一旦条件不成立,则要在碰到下一个数字时重新记载这个数字的属性(位置),而如果碰到了练习的四个数字,那么还要识别这四个数字后面还是否还有四个字符。可以看出,使用纯java代码的逻辑不复杂,但是却比较繁琐。
解决办法二:使用正则表达式
class regularExpression {
//注:replaceAll与replaceFirst支持正则表达式,而replace不支持
public static void main(String[] args) {
String sentence0 = "my name is tom , my tel is 1234-5678";
String sentence1 = "my name is marry , my tel is 4321-5678 , thank you !";
System.out.println("句子一被替换之前:" + sentence0);
System.out.println("句子二被替换之前:" + sentence1);
System.out.println("句子一被替换后:" + sentence0.replaceAll("[0-9]{3}-[0-9]{3}", "***-***"));
System.out.println("句子二被替换后:" + sentence1.replaceAll("[0-9]{3}-[0-9]{3}", "***-***"));
}
}
结果:
从regularExpression例子中可以看到,正则表达式已经大大简化了字符串匹配的编写程序的工作量。如果要系统了解正则表达式,则可以出一本数来介绍了。
首先从regularExpression列子中,一对([])之间可以包换一组字符,称其为字符集。上述表达式中的"[0-9]"表示字符集为0-9的数字,更一般的情况就是允许字符列在[]符号之中,例如"[abc]"表示字符a、b、c是符合要求的字符,而"[0-9]"则表示一个范围。字符集也允许使用多个字符范围,例如"[0-9A-Z]"表示允许数字0-9和所有的大写字母。而希望是相反的,即除了字符集中的其他所有的字符都合法的时候只需要在'['符号后面加一个'^'符号就可以了。例如"[^0-9]"则表示除了0-9外的所有字符都是合法的。
正则表达式'[0-9]{3}-[0-9]{3}'中出现的{3}表示前面相邻的字符集中的字符要出现3次,即前面应该是3位数字,这就是正则表达式中的限定符。限定符还有以下几种。
限定符 | 含义 | 示例 |
---|---|---|
* | 符合前面字符集中次数为零次或多次 | fe*可以匹配f、fe、fee、feee |
+ | 匹配前面字符集中的字符一次或一次以上 | fe+ 可以匹配 fe、fee、feee |
? | 匹配前面字符集中的字符零次或一次 | fe?可以匹配 f、fe |
{n} | 匹配前面字符集中有n次,n为非负整数 | fe{2} 可以匹配 fee |
{n,} | 至少匹配前面字符集中有n次,n为非负整数 | fe{2,}可以匹配fee、feee |
{n,m} | 至少匹配n次,最多匹配m次,n-m之间非负整数 | fe{2,3}可以匹配fee、feee |
有了以上基本知识后,我们就可以用来判断邮箱一类的表达式了。例如[a-z0-9A-Z]+@[0-9a-zA-z]+.[0-9a-zA-Z.]{2,}就表示一个邮箱的基本结构的正则表达式。
例如我们将regularExpression稍稍修改:
public class regularExpression0 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String sentence0 = "my name is tom , my mail is tom@sina.com.cn";
String sentence1 = "my name is marry , my mail is marry@163.com , thank you !";
System.out.println("句子一被替换之前:" + sentence0);
System.out.println("句子二被替换之前:" + sentence1);
System.out.println("句子一被替换后:" + sentence0.replaceAll("[0-9a-zA-Z]+@[0-9a-zA-Z]+.[0-9a-zA-Z.]{2,}", "[E-mail]"));
System.out.println("句子二被替换后:" + sentence1.replaceAll("[0-9a-zA-Z]+@[0-9a-zA-Z]+.[0-9a-zA-Z.]{2,}", "[E-mail]"));
}
}
结果:
其实,正则表达式除了常规字符以外还可以包含特殊字符,比如制表符、回车符等。例如我们要分割一些人名,这些名字之间还有一些特殊字符。也可以通过正则表达式解决
class regularExpression1 {
public static void main(String[] args) {
String names="tom\tMarray\rlion\nMick";
String nameList[]=names.split("[\t\r\n]+");
for(String name:nameList) {
System.out.println(name);
}
}
}
结果:
正则表达式在验证数据输入是否合法以及检索特定特征字符串方法有着极为方便的应用,如果工作中有大量的此类工作的需要。应阅读正则表达式的相关书籍