JAVA正则表达式经典实例教程[huiqinbo]

归纳者     : huiqinbo

address:beijingChina

个人主页 : http://www.huiqinbo.com

time       :  2008-12-12JAVA正则表达式实例教程1、正则表达式的知识要点

1、正则表达式是什么?

正则表达式是一种可以用于模式匹配和替换的强有力的工具。

2、正则表达式的优点?

更少的代码,更高的效率。

3、正则表达式如何使用?

在下面的教程中我们将学习到正则表达式的用法。

4、正则表达式的缺点?

需要花一定的时间学习,这个时间由个人决定,一天或者更久一些。

2、正则表达式的各种符号及其含义

常用的符号

.表示任意一个字符

\s空格字符(空格键,tab,换行,换页,回车)

\S非空格字符([^\s])

\d一个数字,(相当于[0-9])

\D一个非数字的字符,(相当于[^0-9])

\w一个单词字符(wordcharacter)(相当于[a-zA-Z_0-9])

\W一个非单词的字符,[^\w]

^一行的开始

$一行的结尾

\b一个单词的边界

\B一个非单词的边界

\G前一个匹配的结束

[]匹配方括号内的一个字符

例如:[abc]表示字符a,b,c中的任意一个(与a|b|c相同)

[a-zA-Z]表示从a到z或A到Z当中的任意一个字符

表示次数的符号

*重复零次或更多次

例如:a*匹配零个或者多个a

+重复一次或更多次

例如:a+匹配一个或者多个a

?重复零次或一次

例如:a?匹配零个或一个a

{n}重复n次

例如:a{4}匹配4个a

{n,}重复n次或更多次

例如:a{4,}匹配至少4个a

{n,m}重复n到m次

例如:a{4,10} 匹配4~10个a

 

3、正则表达式实例

java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现:

1、首先引入java包:java.util.regex

2、使用方法如下:

共分三步:

①构造一个模式.

Patternp=Pattern.compile("[a-z]*");

②建造一个匹配器

Matcherm=p.matcher(str);

③进行判断,得到结果

booleanb=m.matches();

Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到

时返回true,没匹配到则返回false

①m.matches()

matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true

②m.lookingAt()

lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返

回true

③m.find()

find()对字符串进行匹配,匹配到的字符串可以在任何位置

Matcher类的其他方法

intgroupcount()返回此匹配器模式中的捕获组数。

StringreplaceAll(Stringreplacement)用给定的replacement全部替代匹配的

部分

StringrepalceFirst(Stringreplacement)用给定的replacement替代第一次匹

配的部分

appendReplacement(StringBuffersb,Stringreplacement)根据模式用

replacement替换相应内容,并将匹配的结果添加到sb当前位置之后

StringBufferappendTail(StringBuffersb)将输入序列中匹配之后的末尾字串

添加到sb当前位置之后.

group(n)0代表永远都是匹配整个表达式的字符串的那部分n<>0时代表

第n组匹配的部分

①字符匹配

Patternp=Pattern.compile(expression);//正则表达式

Matcherm=p.matcher(str);//操作的字符串

booleanb=m.matches();//返回是否匹配的结果

System.out.println(b);

Pattern p = Pattern.compile(expression); // 正则表达式

实例3:

Matcherm=p.matcher(str);//操作的字符串

booleanb=m.lookingAt();//返回是否匹配的结果

System.out.println(b);

Patternp=Pattern.compile(expression);//正则表达式

Matcherm=p.matcher(str);//操作的字符串

booleanb=m..find();//返回是否匹配的结果

System.out.println(b);

②分割字符串

Patternpattern=Pattern.compile(expression);//正则表达式

String[]strs=pattern.split(str);//操作字符串得到返回的字符串数组

③替换字符串

Patternp=Pattern.compile(expression);//正则表达式

Matcherm=p.matcher(text);//操作的字符串

Strings=m.replaceAll(str);//替换后的字符串

④查找替换指定字符串

Patternp=Pattern.compile(expression);//正则表达式

Matcherm=p.matcher(text);//操作的字符串

StringBuffersb=newStringBuffer();

inti=0;

while(m.find()){

m.appendReplacement(sb,str);

i++;//字符串出现次数

}

m.appendTail(sb);//从截取点将后面的字符串接上

Strings=sb.toString();

⑤查找输出字符串

Patternp=Pattern.compile(expression);//正则表达式

Matcherm=p.matcher(text);//操作的字符串

while(m.find()){

//m.start()返回匹配到的子字符串在字符串中的索引位置.

//m.end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.

//m.group()返回匹配到的子字符串

}

实例4:

3、下面通过几个例子来理解一下正则表达式的妙用

3.1匹配字符串(matches()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=null;//正则表达式

Matcherm=null;//操作的字符串

booleanb=false;

//正则表达式表示首字母是a,中间是任意字符,结尾以b结束

//不匹配的结果

p=Pattern.compile("a*b");

m=p.matcher("baaaaab");

b=m.matches();

System.out.println("匹配结果:"+b);//输出:true

//匹配的结果

p=Pattern.compile("a*b");

m=p.matcher("aaaaab");

b=m.matches();

System.out.println("匹配结果:"+b);//输出:false

}

publicstaticvoidmain(Stringargus[]){

test();

}

}

实例5:

3.2判断手机号码(matches()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=null;//正则表达式

Matcherm=null;//操作的字符串

booleanb=false;

//正则表达式表示第一位是1,第二位为3或5,结尾为9位数字的一串数字

p=Pattern.compile("^[1][3,5]+\\d{9}");

m=p.matcher("13812345678");

b=m.matches();

System.out.println("手机号码正确:"+b);//输出:true

//

p=Pattern.compile("[1][3,5]+\\d{9}");

m=p.matcher("03812345678");//错误首位为0

//m=p.matcher("13812345-7a");//错误字符串中有字母或者字符

b=m.matches();

System.out.println("手机号码错误:"+b);//输出:false

}

publicstaticvoidmain(Stringargus[]){

test();

}

}

实例6:

3.3身份证号码验证

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=null;//正则表达式

Matcherm=null;//操作的字符串

booleanb=false;

//正则表达式表示15位或者18位数字的一串数字

p = Pattern.compile("

\\d{15}|\\d{18}");

m=p.matcher("120101198506020080");

b=m.matches();

System.out.println("身份证号码正确:"+b);//输出:true

//

p=Pattern.compile("\\d{15}|\\d{18}");

m=p.matcher("020101198506020080");//错误首位为0

b=m.matches();

System.out.println("身份证号码错误:"+b);//输出:false

}

publicstaticvoidmain(Stringargus[]){

test();

}

}

实例7:

3.4email验证

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=null;//正则表达式

Matcherm=null;//操作的字符串

booleanb=false;

//正则表达式表示邮箱号码

p=Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+

([-.]\\w+)*");

m=p.matcher("[email protected]");

b=m.matches();

System.out.println("email号码正确:"+b);//输出:true

//

p=Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+

([-.]\\w+)*");

m=p.matcher("user.test.com");//错误@应为.

b=m.matches();

System.out.println("email号码错误:"+b);//输出:false

}

publicstaticvoidmain(Stringargus[]){

test();

}

}

实例8:

3.5IP地址检查

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=null;//正则表达式

Matcherm=null;//操作的字符串

booleanb=false;

//正则表达式表示邮箱号码

p=

Pattern.compile("

\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}");

m=p.matcher("192.168.1.1");

b=m.matches();

System.out.println("IP正确:"+b);//输出:true

//

p=

Pattern.compile("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}");

m=p.matcher("192.168.1.1234");//错误应该为3位不应该是4位

b=m.matches();

System.out.println("IP错误:"+b);//输出:false

}

publicstaticvoidmain(Stringargus[]){

test();

}

}

 

实例9:

3.6中文名

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=null;//正则表达式

Matcherm=null;//操作的字符串

booleanb=false;

//正则表达式表示汉字的一串字符串

p=Pattern.compile("^[\u4e00-\u9fa5]+$");

m=p.matcher("貂禅");

b=m.matches();

System.out.println("中文名正确:"+b);//输出:true

//

p=Pattern.compile("^[\u4e00-\u9fa5]+$");

m=p.matcher("nick");//错误只能是中文

b=m.matches();

System.out.println("中文名错误:"+b);//输出:false

}

publicstaticvoidmain(Stringargus[]){

test();

}

}

实例10:

JAVA正则表达式实例教程12/11/2008

3.7字符串匹配的返回

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

/**

*start()返回匹配到的子字符串在字符串中的索引位置.

*end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.

*group()返回匹配到的子字符串

*/

Patternp=Pattern.compile("\\d+");

Matcherm=p.matcher("aaa2223bb11222");

while(m.find()){

System.out.println(m.start());//第一个循环返回3,第二个循环返回

9

System.out.println(m.end());//返回7,第二个循环返回14

System.out.println(m.group());//返回2233,第二个返回11222

}

}

publicstaticvoidmain(Stringargus[]){

test();

}

}

实例11:

JAVA正则表达式实例教程12/11/2008

3.8groupCount、group()、group(n)的用法

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

/*

*本例groupCount将返回三组a11bbb、11、bbb

*/

Pattern p=Pattern.compile("

实例11:

JAVA正则表达式实例教程12/11/2008

3.8groupCount、group()、group(n)的用法

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

/*

*本例groupCount将返回三组a11bbb、11、bbb

*/

Pattern p=Pattern.compile("

\\w(\\d\\d)(\\w+)");

Matcherm=p.matcher("aa11bbb");

if(m.find()){

intcount=m.groupCount();//返回匹配组的数目,而不是匹配字符串

的数目

for(inti=0;i<=count;i++)

System.out.println("group"+i+":"+m.group(i));

}

}

/*

*返回结果如下

*group0:a11bbb

*group1:11

*group2:bbb

*/

publicstaticvoidmain(Stringargus[]){

test();

}

}

  实例12:

JAVA正则表达式实例教程12/11/2008

3.9分割字符串(split()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Pattern p=Pattern.compile("

实例12:

JAVA正则表达式实例教程12/11/2008

3.9分割字符串(split()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Pattern p=Pattern.compile("

\\d+"); //将所含数字去掉

Stringstr[]=p.split("aa11bbb33cc55gg");

for(inti=0;i<str.length;i++){

System.out.println(str[i]);

}

}

/*

*返回结果如下

*aa

*bbb

*cc

*gg

*/

publicstaticvoidmain(Stringargus[]){

test();

}

}

  实例13:

JAVA正则表达式实例教程12/11/2008

3.10字符串替换(replaceAll()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Pattern p = Pattern.compile("

实例13:

JAVA正则表达式实例教程12/11/2008

3.10字符串替换(replaceAll()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Pattern p = Pattern.compile("

\\d+"); //将所含数字全部替换为XX

Matcherm=p.matcher("aa11bbb33cc55gg");

Stringstr=m.replaceAll("XX");

System.out.println(str);

}

/*

*返回结果如下

*aaXXbbbXXccXXgg

*/

publicstaticvoidmain(Stringargus[]){

test();

}

}

  实例14:

3.11字符串替换2(appendReplacement()方法及appendTail()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=Pattern.compile("55");

Matcherm=p.matcher("aa11bbb33cc55gg55yy");

StringBuffersb=newStringBuffer();

while(m.find()){

m.appendReplacement(sb,"@@");//用@@替换所有的55

}

System.out.println(sb.toString());//打印

实例14:

3.11字符串替换2(appendReplacement()方法及appendTail()方法)

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassRegTest{

staticvoidtest(){

Patternp=Pattern.compile("55");

Matcherm=p.matcher("aa11bbb33cc55gg55yy");

StringBuffersb=newStringBuffer();

while(m.find()){

m.appendReplacement(sb,"@@");//用@@替换所有的55

}

System.out.println(sb.toString());//打印

aa11bbb33cc@@gg@@

m.appendTail(sb);//将最后一次替换后的字符串加上

System.out.println(sb.toString());//打印aa11bbb33cc@@gg@@yy

}

/*

*返回结果如下aa11bbb33cc@@gg@@、aa11bbb33cc@@gg@@yy

*/

publicstaticvoidmain(Stringargus[]){

test();

}

}

  实例15:

JAVA正则表达式实例教程12/11/2008

4、常用的正则表达式

//email 正确的书写格式为 huiqinbo

实例15:

JAVA正则表达式实例教程12/11/2008

4、常用的正则表达式

//email 正确的书写格式为 huiqinbo

@163.com

staticString_email="\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+

([-.]\\w+)*";

//电话正确格式012-87654321、0123-87654321、0123-7654321

staticString_tel=

"\\d{4}-\\d{8}|\\d{4}-\\d{7}|\\d(3)-\\d(8)";

//手机号码1318765432113587654321

staticString_phone="^[1][3,5]+\\d{9}";

//汉字中国

staticString_chinse="^[\u4e00-\u9fa5]+$";

//IP192.168.1.1

staticString_ip=

"\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}";

//QQ456789

staticString_qq="[1-9][0-9]{4,13}";

//邮编210000

staticString_mail="[1-9]\\d{5}(?!\\d)";

//身份证号码15或者18位

static String _id = "\\d{15}|\\d{18}";

5、结尾

1、通过以上的学习,大家可能对正则表达式有了初步的了解和认识,大家在以后的学

习和工作中逐渐加深对Java正则表达式的理解,一定会在编程的过程中起到很大作用。

6、钦波个人总结一点正则知道给大家分享下:

 一:

 public final static String STR_AAAAA = "([a-zA-Z0-9]{1})([a-zA-Z_0-9]{0,30})";

 通过这个例子给大分析下,在项目中我们常这样规范,就是来自客户端的请求格式。那么我说明下:

  这一串正则表达式意思是:以a-z或A-Z或0-9任意间期的字符开头并且重复一次,也就是说这个字符比如是v字符那么且只能有一个; 然后再以a-z或A-Z或下划线或0-9任意间期的字符开头可重复0到30次,也就是说这个字符可以是t,那么它可以是0到30个,

   如ttttttttttttttttttttttttttttttttttttt 30个,

再如:vywsfsfdfdsfsdffsljjlkjkljjljkjkjy 30个。

这里说明下,这个0到30次重复不是只,一个字符一直的重复,而是在[a-zA-Z_0-9]这个范围内的重复。

总结:这一串正则意思是,不以下划线开头的  在a-zA-Z0-9 这期间 1到31个字符。

二:

public final static String STR_HANDDD

= "(?![fF]{4}-[fF]{4}-[fF]{4}-[fF]{4})([0-9A-Fa-f]{4})(-[0-9A-Fa-f]{4}){3}";

说明:!是只否定的意思,首先说不要以fff-ffff-ffff-ffff 或 FFFF-FFFF-FFFF-FFFF这两种格式开头1次或0次,然后正确的格式是:

如:0000-AAAA-bbbb-FFFF

详细解释:

0000    是([0-9A-Fa-f]{4})  它来决定的

-AAAA  是 -[0-9A-Fa-f]{4}  它来决定的

-bbbb   是 -[0-9A-Fa-f]{4}  它来决定的

-FFFF    是 -[0-9A-Fa-f]{4}  它来决定的

共3次({3});

声明:

本内容有些是根据网络文章整理而成,如有侵权,请与本人联系

若哪里有误,望体谅并指正

本文内容仅供参考,不得用于商业目的

转载请著名作者和出处

笔者简介

http://www.huiqinbo.com

qq:444084929[回钦波]

相关推荐