您的位置:首页 > 职场人生

【黑马程序员】java正则表达式的学习和总结

2013-11-17 20:28 597 查看
------- 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培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: