正则表达式 学习笔记一
徒弟:师傅呀,我接到新任务,要过滤字符串,进行筛选,一个个对比,貌似好麻烦哟!
师傅:都什么年代啦,你的效率低不低呀?用正则吧,,谁用谁知道好!
1、 什么是正则表达式
在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
参考网址:http://baike.baidu.com/view/94238.htm
2、 功能强大的文本处理语言
正则表达式是一种威力无比强大的武器,几乎在所有的程序设计语言里和计算机平台上都可以用它来完成各种复杂的文本处理工作。本书从简单的文本匹配开始,循序渐进地介绍了很多复杂内容,其中包括回溯引用、条件性求值和前后查找,等等。每章都为读者准备了许多简明又实用的示例,有助于全面、系统、快速掌握正则表达式,并运用它们去解决实际问题。
3、相对传统文本处理的优势:
1)、灵活
2)、高效
3)、强大
4)、便捷
4、 正则表达式实例
实例一:
验证数字字符串
要求:验证一个字符串是否全部由数字构成
看个例子:
传统的编程方式:
public class GeneralNumTest {
public static void main(String[] args) {
String[] values = new String[] { "10" , "325678" , "987799" , "99999" , "amd" , "nvdita" , "86BF" };
for (String value : values) {
System. out .println( "校验值:\t" + value);
if ( isOctNumber (value)) {
System. out .println( "[" + value + "] 校验是数字" );
}
if ( isHexNumber (value)) {
System. out .println( "[" + value + "] 校验是16进制数字" );
}
}
}
//16进制校验
private static boolean isHexNumber(String value) {
boolean result = true ;
for ( int i = 0, j = value.length(); i < j; i++) {
char c = value.charAt(i);
if (c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9'
|| c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e' || c == 'f' || c == 'A' || c == 'B' || c == 'C' || c == 'D' || c == 'E' || c == 'F' ) {
continue ;
} else {
result = false ;
break ;
}
}
return result;
}
// 传统校验方式
private static boolean isOctNumber(String value) {
boolean result = true ;
for ( int i = 0, j = value.length(); i < j; i++) {
char c = value.charAt(i);
if (c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9' ) {
continue ;
} else {
result = false ;
break ;
}
}
return result;
}
}
运行结果,这里就不展示了。
正则表达式对数字字符串验证的解法:
public class GeneralNumTest {
public static final String OCT_NUM_REGEX = "\\d+" ;
public static final String HEX_NUM_REGEX = "(?i)[0-9a-f]+" ;
public static void main(String[] args) {
String[] values = new String[] { "10" , "325678" , "987799" , "99999" , "amd" , "nvdita" , "86BF" };
for (String value : values) {
System . out .println( "校验值:\t" + value);
if ( isOctNumber (value)) {
System . out .println( "[" + value + "] 校验是数字" );
}
if ( isHexNumber (value)) {
System . out .println( "[" + value + "] 校验是16进制数字" );
}
}
}
private static boolean isHexNumber(String value) {
String validateRegx = Regexes. HEX_NUM_REGEX ;
return value.matches(validateRegx);
}
private static boolean isOctNumber(String value) {
String validateRegx = Regexes. OCT_NUM_REGEX ;
return value.matches(validateRegx);
}
}
依赖的Regexes:
public class Regexes {
public static final String OCT_NUM_REGEX = "\\d+" ;
public static final String HEX_NUM_REGEX = "(?i)[0-9a-f]+" ;
}
运行结果:
校验值: 10
[10] 校验是数字
[10] 校验是16进制数字
校验值: 325678
[325678] 校验是数字
[325678] 校验是16进制数字
校验值: 987799
[987799] 校验是数字
[987799] 校验是16进制数字
校验值: 99999
[99999] 校验是数字
[99999] 校验是16进制数字
校验值: amd
校验值: nvdita
校验值: 86BF
[86BF] 校验是16进制数字
实例二:
验证email地址
要求:验证一个字符串是否合法的email地址
public class EamilTest {
public static void main(String[] args) {
String[] emails = new String[] { "testone@163.com" ,
"tt.one.next@163.com" , "www.163.com@163-com.com" ,
".leemaster@163" , "luckdog.com" };
for (String email:emails){
System. out .println( "验证的eamil是:" +email);
if ( isValideEmail (email)){
System. out .println( "[" +email+ "] 是有效的邮件地址" );
}
}
}
private static boolean isValideEmail(String email) {
return email.matches(Regexes. EMAIL_REGEX );
}
}
public class Regexes {
public static final String OCT_NUM_REGEX = "\\d+" ;
public static final String HEX_NUM_REGEX = "(?i)[0-9a-f]+" ;
public static final String EMAIL_REGEX = "(?i)(?<=\\b)[a-z0-9][-a-z0-9_.]+[a-z0-9]@([a-z0-9][-a-z0-9]+\\.)+[a-z]{2,4}(?=\\b)" ;
}
运行结果:
验证的eamil是:testone@163.com
[testone@163.com] 是有效的邮件地址
验证的eamil是:tt.one.next@163.com
[tt.one.next@163.com] 是有效的邮件地址
验证的eamil是:www.163.com@163-com.com
[www.163.com@163-com.com] 是有效的邮件地址
验证的eamil是:.leemaster@163
验证的eamil是:luckdog.com
未完待续。。。