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

黑马程序员_Java基础_正则表达式

2014-12-12 21:25 537 查看
一、正则表达式(特点)

正则表达式:符合一定规则的表达式。

特点:用一些特定的符号来表示一些代码操作,这样就简化书写。

所以学习正则表达式就是在学习一些特殊符号的使用。

作用:用于操作字符串。

好处:可以简化对字符串的复杂操作。

弊端:符号定义越多,正则越长,阅读性越差。

先来看一个示例:

[java] view
plaincopy

/*

示例:

*/

class RegexDemo

{

public static void main(String[] args)

{

checkQQ_1();

checkQQ_2();

}

/*

对QQ号码进行校验:

要求:5-15位。0不能开头,只能是数字。

*/

public static void checkQQ_2()//使用正则表达式

{

String qq="1a234576";

String regex="[1-9][0-9]{4,14}";

boolean flag=qq.matches(regex);

if(flag)

{

System.out.println("QQ:"+qq);

}

else

{

System.out.println("输入不合法");

}

}

public static void checkQQ_1()//这种方式使用String类中的方法,进行组合完成了需求。但是代码国语复杂。

{

String qq="123456";

int len=qq.length();

if(len>=5 && len<=15)

{

if(!qq.startsWith("0"))

{

try

{

Long l=Long.parseLong(qq);

System.out.println("QQ:"+l);

}

catch (NumberFormatException e)

{

System.out.println("出现非法字符");

}

/*

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("长度错误。");

}

}

}



二、正则表达式(匹配)

[java] view
plaincopy

/*

具体操作功能:

1.匹配。public boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。

*/

class RegexDemo2

{

public static void main(String[] args)

{

checkTel();

}

public static void checkTel()//手机号码段只有 187******** 150******** 178********

{

String str1="18712334567";

String str2="10012334567";

String reg="1[578]\\d{9}";

System.out.println(str1.matches(reg));

System.out.println(str2.matches(reg));

}

}



三、正则表达式(切割)

[java] view
plaincopy

/*

具体操作功能:

2.切割。public String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。

*/

class RegexDemo3

{

public static void main(String[] args)

{

splitDemo("zhangsan lisi wangwu zhaoliu"," +");//切割包含多个空格的

System.out.println();

splitDemo("zhangsan.lisi.wangwu.zhaoliu","\\.");//切割包含.的

System.out.println();

splitDemo("c:\\abc\\a.txt","\\\\");//切割目录

System.out.println();

splitDemo("asdfassssdjfkzzzzzzodff","(.)\\1+");/*

按照叠词完成切割,为了可以让规则的结果被重用,

可以将规则封装成一个组,用()完成。组的出现都有编号,

从1开始,想要使用自己已有的组,可以通过\n(n是组的编号)

的形式来获取。

*/

}

public static void splitDemo(String str,String reg)

{

String[] arr=str.split(reg);

for(String s:arr)

{

System.out.println(s);

}

}

}



四、正则表达式(替换)

[java] view
plaincopy

/*

具体操作功能:

3.替换。public String replaceAll(String regex,String replacement):

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

*/

class RegexDemo4

{

public static void main(String[] args)

{

String str1="asdvfsa123124356asjdf4334543234iupok43234123fsa";

replaceAllDemo(str1,"\\d{5,}","#");//将字符串中的数字长度大于5的子段替换成#

String str2="asdfssswqqqfsdffff";//将重叠的字符替换成单个字母。例如: ssss----->s

replaceAllDemo(str2,"(.)\\1+","$1");

}

public static void replaceAllDemo(String str,String reg,String newStr)

{

str=str.replaceAll(reg,newStr);

System.out.println(str);

}

}



五、正则表达式(获取)

[java] view
plaincopy

/*

具体操作功能:

4.获取:将字符串中的符合规则的子串取出。

步骤:

1.将正则表达式封装成对象。

2.让正则对象和要操作的字符串相关联。

3.关联后,获取正则匹配引擎。

4.通过引擎对符合规则的字串进行操作,例如取出。

*/

import java.util.regex.*;

class RegexDemo5

{

public static void main(String[] args)

{

getDemo();

}

public static void getDemo()

{

String str="java ji chu";

String reg="\\b[a-z]{3}\\b";

//将规则封装成对象。

Pattern p=Pattern.compile(reg);

//让正则对象和要作用的字符串相关联,获取匹配器对象。

Matcher m=p.matcher(str);

//System.out.println(m.matches());/*String类中的matches方法用的就是Pattern和Matcher对象来完成的*/

/*只不过被String的方法封装后,用起来较为简单,但功能单一。*/

//System.out.println("matches:"+m.matches());//注意:同一个匹配器用的同一个指针。

while(m.find())//将规则作用到字符串上,并进行符合规则的子串查找。

{

System.out.println(m.group());//用于获取匹配后结果。

}

}

}



六、正则表达式(练习1)

[java] view
plaincopy

/*

需求:

将下列字符串转成:我要学编程

用四种功能的哪一个呢?或哪几个呢?

思路:

1.如果只想知道该字符是否是对是错,使用匹配。

2.想要将已有的字符串变成另一个字符串,替换。

3.想要按照自定的方式将字符串编程多个字符串,切割。获取规则以外的子串。

4.想要拿到符合要求的字符串的字串,获取。获取符合规则的子串。

*/

class RegexText

{

public static void main(String[] args)

{

test_1();

}

public static void test_1()

{

String str="我我我我.....我我我我..要..要要要要要...要要要要.学.学.学学学.编.编..编编编.程.程程程.程";

/*

将已有字符串编程另一个字符串,使用替换功能。

1.可以现将.去掉

2.再将多个重复的内容变成单个内容。

*/

str=str.replaceAll("\\.+","");

System.out.println(str);

str=str.replaceAll("(.)\\1+","$1");

System.out.println(str);

}

}



七、正则表达式(练习2)

[java] view
plaincopy

/*

192.168.1.1 102.49.23.013 10.10.10.10 2.2.2.8 8.109.90.30

将ip地址进行地址段顺序排序。

还按照字符串自然顺序,只要让它们每一段都是3位即可。

1.按照每一段需要的对多的0进行补齐,那么每一段就会至少保证有3位。

2.将每一段只保留3位。这样,所有的ip地址都是每一段3位。

*/

import java.util.*;

class RegexText2

{

public static void main(String[] args)

{

ipSort();

checkMail();

}

public static void ipSort()

{

String ip="192.168.1.1 102.49.23.013 10.10.10.10 2.2.2.8 8.109.90.30";

ip=ip.replaceAll("(\\d+)","00$1");

System.out.println(ip);

ip=ip.replaceAll("0*(\\d{3})","$1");

System.out.println(ip);

String[] arr=ip.split(" ");

TreeSet<String> ts=new TreeSet<String>();

for(String s:arr)

{

ts.add(s);

}

System.out.println();

for(String s:ts)

{

System.out.println(s.replaceAll("0*(\\d+)","$1"));

}

}

public static void checkMail()

{

String mail="abc@sohu.com.cn";

String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//精确匹配

//reg="\\w+@\\w+(\\.\\w+){1,3}";//相对不太精确的匹配 1@2.1 就没意义了

System.out.println();

System.out.println(mail.matches(reg));

}

}



八、正则表达式(网页爬虫)

网页:

[html] view
plaincopy

<html>

<head>

<title>

邮件获取

</title>

</head>

<body>

<div>

djkfjalksdjflkdsajf zhangsan@126.com asdfaewfsdaf;wefaskjfdalkdsf

alewjflkadsg lisi@sohu.com aslkjf;lsakdfj;oiewajflakjdsg;lkajdsgaaldskfljklj

fdjglkadjglkasdjf;lkjdsaf;lksaef ;lrsjg;;rajg aslkd;kdjflkjlsad

arewjgalkfdjg;lkfdajg; w wangwu@126.com eokflasjglkajfd;glaijdg;

welkjliewajugijfdalkg arj;lewaoigfla

</div>

</body>

</html>

[java] view
plaincopy

/*

网页爬虫(蜘蛛)。

*/

import java.net.*;

import java.io.*;

import java.util.regex.*;

class RegexText3

{

public static void main(String[] args)throws Exception

{

getMails();

}

public static void getMails()throws Exception

{

/*

获取邮件地址。使用Pattern Matcher

*/

URL url=new URL("http://172.16.56.254:8080/myweb/mail.html");

URLConnection conn=url.openConnection();

BufferedReader bufrIn=new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line=null;

String mailreg="\\w+@\\w+(\\.\\w+){1,3}";

Pattern p=Pattern.compile(mailreg);

while((line=bufrIn.readLine())!=null)

{

Matcher m=p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息