【黑马程序员】java正则表达式的学习和总结
2013-11-17 20:28
597 查看
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
正则表达式:符合一定规则的表达式。
作用:专门用于匹配 、切割、替换、获取等对字符串的一系列操作。
特点:用于一些特定的符号来表示一些代码操作,这样就简化书写。
所以学习正则表达式就是学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性差。
那么我们知道。对于字符串的操作我们已经有了String这么一么一个类来使用,那么为什么还要使用正则表达式?
那么我告诉你,String类使用起来相比较正则表达式来说就麻烦多了。我们来看看例子!
我们现在要写一个对QQ号的校验的代码,要求5-15位,不能0开头,只能是数字。
这种方法是使用了String类中的方法进行组合,完成了需求,但是代码比较复杂。
那么我们来看看使用正则表达式的例子。
使用正则表达式后代码就只用写了一个相应的规则字符串,代码一下减少不少!太给力了吧!
那么我们来看一下正则表达式的具体操作功能吧!
1.匹配
使用String类中的matches方法,boolean matches(String regex )传入一个正则表达式的字符串,然后判断是否符合这个正则表达式,如果匹配了就返回true不匹配返回false。学习正则表达式就是学习一些特殊符号的使用。
那么这个正则表达式都有哪些符号?具体意思?如何定义呢?具体符号说明定义,大家可以查阅一下API文档,然后参考我上面checkQQ那个简单例子,了解一下简单使用方法。
下面我列举常用的一些正则表达式方便大家匹配使用:
1。^/d+$ //匹配非负整数(正整数
+ 0)
2。^[0-9]*[1-9][0-9]*$ //匹配正整数
3。^((-/d+)|(0+))$ //匹配非正整数(负整数
+ 0)
4。^-[0-9]*[1-9][0-9]*$ //匹配负整数
5。^-?/d+$ //匹配整数
6。^/d+(/./d+)?$ //匹配非负浮点数(正浮点数
+ 0)
7。^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮点数
8。^((-/d+(/./d+)?)|(0+(/.0+)?))$ //匹配非正浮点数(负浮点数
+ 0)
9。^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配负浮点数
10。^(-?/d+)(/./d+)?$ //匹配浮点数
11。^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
12。^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
13。^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
14。^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
15。^/w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
16。^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$ //匹配email地址
17。^[a-zA-z]+://匹配(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$ //匹配url
18。匹配中文字符的正则表达式:
[/u4e00-/u9fa5]
19。匹配双字节字符(包括汉字在内):[^/x00-/xff]
20。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return
this.replace([^/x00-/xff]/g,"aa").length;}
21。匹配空行的正则表达式:/n[/s|
]*/r
22。匹配HTML标记的正则表达式:/<(.*)>.*<///1>|<(.*)
//>/
23。匹配首尾空格的正则表达式:(^/s*)|(/s*$)
*
正则表达式用例
*
1、^/S+[a-z
A-Z]$ 不能为空 不能有空格 只能是英文字母
*
2、/S{6,}
不能为空 六位以上 *
3、^/d+$
不能有空格 不能非数字 *
4、(.*)(/.jpg|/.bmp)$
只能是jpg和bmp格式 *
5、^/d{4}/-/d{1,2}-/d{1,2}$
只能是2004-10-22格式
*
6、^0$
至少选一项 *
7、^0{2,}$
至少选两项 *
8、^[/s|/S]{20,}$
不能为空 二十字以上 *
9、^/+?[a-z0-9](([-+.]|[_]+)?[a-z0-9]+)*@([a-z0-9]+(/.|/-))+[a-z]{2,6}$邮件
*
10、/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*([,;]/s*/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*)*
输入多个地址用逗号或空格分隔邮件 *
11、^(/([0-9]+/))?[0-9]{7,8}$电话号码7位或8位或前面有区号例如(022)87341628
*
12、^[a-z
A-Z
0-9 _]+@[a-z
A-Z
0-9 _]+(/.[a-z
A-Z
0-9 _]+)+(/,[a-z
A-Z
0-9 _]+@[a-z
A-Z
0-9 _]+(/.[a-z
A-Z
0-9 _]+)+)*$
* 只能是字母、数字、下划线;必须有@和.同时格式要规范 邮件
*
13
^/w+@/w+(/./w+)+(/,/w+@/w+(/./w+)+)*$上面表达式也可以写成这样子,更精练。
14
^/w+((-/w+)|(/./w+))*/@/w+((/.|-)/w+)*/./w+$
[/size]
2.切割
String split(regex); 切割的方法。
小例子:
zhangsan
lisi
wangwu
下面我们来看一个容易出错的例子:
按照代码,我们理所应当的想输出结果应该改也是:
zhangsan
lisi
wangwu
但是,输出结果却不是,那是为什么呢?因为split方法传入的是一个正则表达式,而在正则表达式里“.”代表的是任何字符,拿任意字符去切割,结果是什么都切割不到的。
那么应该怎么做呢?
把String reg="\\."
转换一下就行啦!
这里容易错误的就是对符号的操作需要转译。
叠词,一个字符连续出现多次。比如aa,bbb,cccc。那么我们想切割任意叠词该怎么办?
比如sdfbbbdfsdfccccwerwer这样一个字符串,想要切割结果为:
sdf
dfsdf
werwer
只要有连续相同的就切割。
这个时候需要正则表达式中的组。当你想要对一个规则的结果重用的时候可以把表达式封装成组,组就可以重复使用,组有编号:从1开始。
3.替换
上述例子代码操作了一个字符串,把字符串中的叠词都转换成单词。
期中$符号表示的是组,$1就表示组1。每次替换的时候都换成第一组里的元素。
4.获取
将字符串中符合规则的字串取出。
操作步骤:
1、将正则表达式封装成对象
2、让正则对象和要操作的字符串相关联
3、关联后,获取正则匹配引擎
4、通过引擎对符合规则的字串进行操作,比如取出。
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
正则表达式:符合一定规则的表达式。
作用:专门用于匹配 、切割、替换、获取等对字符串的一系列操作。
特点:用于一些特定的符号来表示一些代码操作,这样就简化书写。
所以学习正则表达式就是学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性差。
那么我们知道。对于字符串的操作我们已经有了String这么一么一个类来使用,那么为什么还要使用正则表达式?
那么我告诉你,String类使用起来相比较正则表达式来说就麻烦多了。我们来看看例子!
我们现在要写一个对QQ号的校验的代码,要求5-15位,不能0开头,只能是数字。
package regex; public class RegexDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub checkQQ(); } static void checkQQ(){ String qq="12340"; int len=qq.length(); if(len>=5&&len<=15){ if(!qq.startsWith("0")){ char[] arr=qq.toCharArray(); boolean flag=true; for(int i=0;i<arr.length;i++){ if(!(arr[i]>='0'&&arr[i]<='9')){ flag=false; break; } } if(flag){ System.out.println("qq:"+qq); }else{ System.out.println("出现非法字符!"); } }else{ System.out.println("不能以0为开头!"); } }else{ System.out.println("长度错误!"); } } }
这种方法是使用了String类中的方法进行组合,完成了需求,但是代码比较复杂。
那么我们来看看使用正则表达式的例子。
package regex; public class RegexDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub checkQQ(); } static void checkQQ(){ String qq="12340"; String regex="[1-9][0-9]{4,14}"; boolean flag=qq.matches(regex); if(flag){ System.out.println("okok"); }else{ System.out.println("nono"); } } }
使用正则表达式后代码就只用写了一个相应的规则字符串,代码一下减少不少!太给力了吧!
那么我们来看一下正则表达式的具体操作功能吧!
1.匹配
使用String类中的matches方法,boolean matches(String regex )传入一个正则表达式的字符串,然后判断是否符合这个正则表达式,如果匹配了就返回true不匹配返回false。学习正则表达式就是学习一些特殊符号的使用。
那么这个正则表达式都有哪些符号?具体意思?如何定义呢?具体符号说明定义,大家可以查阅一下API文档,然后参考我上面checkQQ那个简单例子,了解一下简单使用方法。
下面我列举常用的一些正则表达式方便大家匹配使用:
1。^/d+$ //匹配非负整数(正整数
+ 0)
2。^[0-9]*[1-9][0-9]*$ //匹配正整数
3。^((-/d+)|(0+))$ //匹配非正整数(负整数
+ 0)
4。^-[0-9]*[1-9][0-9]*$ //匹配负整数
5。^-?/d+$ //匹配整数
6。^/d+(/./d+)?$ //匹配非负浮点数(正浮点数
+ 0)
7。^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮点数
8。^((-/d+(/./d+)?)|(0+(/.0+)?))$ //匹配非正浮点数(负浮点数
+ 0)
9。^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配负浮点数
10。^(-?/d+)(/./d+)?$ //匹配浮点数
11。^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
12。^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
13。^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
14。^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
15。^/w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
16。^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$ //匹配email地址
17。^[a-zA-z]+://匹配(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$ //匹配url
18。匹配中文字符的正则表达式:
[/u4e00-/u9fa5]
19。匹配双字节字符(包括汉字在内):[^/x00-/xff]
20。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return
this.replace([^/x00-/xff]/g,"aa").length;}
21。匹配空行的正则表达式:/n[/s|
]*/r
22。匹配HTML标记的正则表达式:/<(.*)>.*<///1>|<(.*)
//>/
23。匹配首尾空格的正则表达式:(^/s*)|(/s*$)
*
正则表达式用例
*
1、^/S+[a-z
A-Z]$ 不能为空 不能有空格 只能是英文字母
*
2、/S{6,}
不能为空 六位以上 *
3、^/d+$
不能有空格 不能非数字 *
4、(.*)(/.jpg|/.bmp)$
只能是jpg和bmp格式 *
5、^/d{4}/-/d{1,2}-/d{1,2}$
只能是2004-10-22格式
*
6、^0$
至少选一项 *
7、^0{2,}$
至少选两项 *
8、^[/s|/S]{20,}$
不能为空 二十字以上 *
9、^/+?[a-z0-9](([-+.]|[_]+)?[a-z0-9]+)*@([a-z0-9]+(/.|/-))+[a-z]{2,6}$邮件
*
10、/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*([,;]/s*/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*)*
输入多个地址用逗号或空格分隔邮件 *
11、^(/([0-9]+/))?[0-9]{7,8}$电话号码7位或8位或前面有区号例如(022)87341628
*
12、^[a-z
A-Z
0-9 _]+@[a-z
A-Z
0-9 _]+(/.[a-z
A-Z
0-9 _]+)+(/,[a-z
A-Z
0-9 _]+@[a-z
A-Z
0-9 _]+(/.[a-z
A-Z
0-9 _]+)+)*$
* 只能是字母、数字、下划线;必须有@和.同时格式要规范 邮件
*
13
^/w+@/w+(/./w+)+(/,/w+@/w+(/./w+)+)*$上面表达式也可以写成这样子,更精练。
14
^/w+((-/w+)|(/./w+))*/@/w+((/.|-)/w+)*/./w+$
[/size]
2.切割
String split(regex); 切割的方法。
小例子:
package regex; public class SplitDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub splitDemo(); } public static void splitDemo(){ String str="zhangsan lisi wangwu"; String reg=" +"; String[] arr=str.split(reg); for(String s:arr){ System.out.println(s); } } }输出结果:
zhangsan
lisi
wangwu
下面我们来看一个容易出错的例子:
package regex; public class SplitDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub splitDemo(); } public static void splitDemo(){ String str="zhangsan.lisi.wangwu"; String reg="."; String[] arr=str.split(reg); for(String s:arr){ System.out.println(s); } } }
按照代码,我们理所应当的想输出结果应该改也是:
zhangsan
lisi
wangwu
但是,输出结果却不是,那是为什么呢?因为split方法传入的是一个正则表达式,而在正则表达式里“.”代表的是任何字符,拿任意字符去切割,结果是什么都切割不到的。
那么应该怎么做呢?
把String reg="\\."
转换一下就行啦!
这里容易错误的就是对符号的操作需要转译。
叠词,一个字符连续出现多次。比如aa,bbb,cccc。那么我们想切割任意叠词该怎么办?
比如sdfbbbdfsdfccccwerwer这样一个字符串,想要切割结果为:
sdf
dfsdf
werwer
只要有连续相同的就切割。
这个时候需要正则表达式中的组。当你想要对一个规则的结果重用的时候可以把表达式封装成组,组就可以重复使用,组有编号:从1开始。
package regex; public class SplitDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub splitDemo(); } public static void splitDemo(){ String str="sdfbbdfsdfccwerwer"; String reg="(.)\\1+"; String[] arr=str.split(reg); for(String s:arr){ System.out.println(s); } } }
3.替换
package regex; public class Replace { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str1="asdbbasdcccasd"; System.out.println(replace(str1,"(.)\\1+","$1")); } public static String replace(String str,String regex,String newStr){ return str=str.replaceAll(regex, newStr); } }
上述例子代码操作了一个字符串,把字符串中的叠词都转换成单词。
期中$符号表示的是组,$1就表示组1。每次替换的时候都换成第一组里的元素。
4.获取
将字符串中符合规则的字串取出。
操作步骤:
1、将正则表达式封装成对象
2、让正则对象和要操作的字符串相关联
3、关联后,获取正则匹配引擎
4、通过引擎对符合规则的字串进行操作,比如取出。
package regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub getDemo(); } public static void getDemo(){ String str="wooo jiao wang rui ya"; String reg="\\b[a-z]{4}\\b"; Pattern p=Pattern.compile(reg); Matcher m=p.matcher(str); System.out.println(m.matches()); while(m.find()){ System.out.println(m.group()); } } }
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
相关文章推荐
- 【黑马程序员】java正则表达式学习总结
- 黑马程序员学习log第九篇基础知识:JAVA的面向对象之正则表达式及反射总结
- 黑马程序员--Java常用正则表达式学习及总结
- java正则表达式学习总结!
- Java 正则表达式学习总结和一些小例子
- Java学习总结(五)——(常用类,正则表达式,集合(List,Set) 迭代器)
- 黑马程序员——java学习15(毕25)——正则表达式
- 黑马程序员 Java自学总结十七 正则表达式
- java正则表达式学习总结,以及和javascript正则表达式的区别
- 黑马程序员-Java基础总结14——正则表达式
- 黑马程序员 java学习笔记--正则表达式
- 黑马程序员 16 Java基础教学 - 16 - 正则表达式总结
- 黑马程序员--java基础--正则表达式总结
- 黑马程序员_Java学习日记第八天--TCP/UDP通信、正则表达式
- 黑马程序员 java学习笔记 Day8:正则表达式
- 黑马程序员_java正则表达式学习
- 黑马程序员_Java正则表达式学习笔记
- 黑马程序员——java学习笔记--正则表达式
- Java 正则表达式学习总结和一些小例子
- 黑马程序员_Java第25天知识总结_正则表达式_匹配_切割_替换_获取_Pattern_Matcher