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

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

2012-08-30 08:05 751 查看
-------
android培训、java培训、期待与您交流! ----------

一、正则表达式(特点)

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

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

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

作用:用于操作字符串。

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

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

先来看一个示例:

/*
示例:
*/
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("长度错误。");
}
}
}




二、正则表达式(匹配)

/*
具体操作功能:
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));
}

}




三、正则表达式(切割)

/*
具体操作功能:
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);
}
}

}




四、正则表达式(替换)

/*
具体操作功能:
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);
}

}




五、正则表达式(获取)

/*
具体操作功能:
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)

/*
需求:
将下列字符串转成:我要学编程

用四种功能的哪一个呢?或哪几个呢?
思路:
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)

/*
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>
<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>


/*
网页爬虫(蜘蛛)。

*/
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());
}
}
}
}




-------
android培训、java培训、期待与您交流! ----------  详细请查看:http://edu.csdn.net/heima/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: