------- 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培训、期待与您交流! -------