Java的正则表达式深入分析的正则表达式深入分析
本篇文章介绍了,Java的正则表达式深入分析。需要的朋友参考下
一.regex(正则表达式):RegularExpressions(代替了StringTokenizer);字符串处理利器;在unix流行,perl使用regex更
牛。
主要用在字符串匹配、查找和替换。例如:匹配IP(范围小于256)使用正则很好搞;从网页中揪出大量email地址发送垃圾邮
件;从网页里揪出链接。包含Matcher(用模式匹配字符串后产生的结果)和pattern。
复制代码 代码如下:
/*
* 告知此字符串是否匹配给定的正则表达式(也是一个字符串)。
*/
System.out.println("abc".matches("..."));//每个"."表示一个字符
复制代码 代码如下:
/*
* 把字符串里的所有数字替换成"-",普通方法需要charAt逐个判断;
* "\d"表示任意一个数字或者换成"[0-9]";
* "\D"表示任意一个非数字或者换成"[^0-9]"
*/
System.out.println("ab54564654sbg48746bshj".replaceAll("[0-9]", "-"));//每个"."表示一个字符
二、
复制代码 代码如下:
/*
* compile将给定的正则表达式编译到模式中(每次编译需要费时间);{3}表示恰好三次。
* X{n} X,恰好 n 次
* X{n,} X,至少 n 次
* X{n,m} X,至少 n 次,但是不超过 m 次
*/
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("ggs");//创建匹配给定输入与此模式的匹配器。内部实际上是创建了一个优先状态的自动机(编译
原理)
//matcher和matches里待匹配的字符串实际上是CharSequence(接口),不过String实现了该接口,存在多态
System.out.println(m.matches());//若是"ggss"就不匹配了
//可一直接"ggs".matches("[a-z]{3}"),不过上面的有好处,至少效率高了,而且Pattern和Matcher提供了很多功能
三、在regex“. * +”中叫Meta Character;ctrl + shift + "/"表示注释,换成"\"表示去掉注释。
复制代码 代码如下:
"a".matches(".");//true,"."表示任意一个字符,汉字也行
"aa".matches("aa");//true,也就是说普通字符串也可以作为正则表达式
/*
* true,"*"表示0或者多个字符,不过后面的要和第一个相同,
* 否则false,也就是判断字符串是否是单一字符组成的字符串
*/
"aaaa".matches("a*");
"".matches("a*");//true
"aaa".matches("a?");//true,一次或者0次
"".matches("a?");//true
"a".matches("a?");//true
"544848154564113".matches("\d{3,100}");//true
//这个是最简单的IP判断,不过若是超过255则判断不出来
"192.168.0.aaa".matches("\d{1,3}\.\d{1,3}\.\d{1,3}\d{1,3}");
"192".matches("[0-2][0-9][0-9]");
四、[abc]表示匹配任意一个字符;[^abc]表示出了abc以外的其他字母(必须还是字母,若是空串也返回false)字符;[a-zA-Z]
等价于"[a-z]|[A-Z]"是否是某个大小写字母;[A-Z&&[ABS]]表示大写字母中取ABS中任一个。
复制代码 代码如下:
//发现|和||没区别,&和&&有区别,不知道这么理解对不对
System.out.println("C".matches("[A-Z&&[ABS]]"));//false
System.out.println("C".matches("[A-Z&[ABS]]"));//true