---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
摘要(正则表达式-----网页爬虫)
正则表达式:(字符串判断方式String)
|--匹配:matches
|--切割: split
|--替换: replaceAll
|--获取 上边三则综合应用
正则表达式包:java.util.regex
例(匹配)
一:模拟QQ登陆(只能是数字,第一位不能是0,总长度是5-15位):
String qq = "23567"; //模拟输入QQ
String regex = "[1-9][0-9]{4-14}";//建立正则:第一位开始,是1-9的数字,第二位开始,是0-9数字并且长度为(4-14)位。
//(加上第一位,总长 5 - 15位)
boolean flag = qq.matches(regex); //调用matches方法,判断,
二:
"[a-zA-Z]\\d"-->第一位开始,是大小写字母,第二位开始,是0-9数字 (总长 2 位)
"[a-zA-Z]\\d?"-->第一位开始,是大小写字母,第二位可能没有。也可能有一位。数字0-9 (总长 1 -2 位)
"[a-zA-Z]\\d*"-->第一位开始,是大小写字母,第二位可能没有,也可能有很多位,数字0-9 (总长 1-? 位)
"1[358]\\d{9}"-->第一位开始,是数字1 , 第二位开始,是数字3.5.8 ,第三位开始,是数字0-9且有9位 (总长 13 位)
例(切割)
一:
String str = "zhang,long,zhao,hu";
String reg = ","; -->正则: 按逗号“,”切
String[] arr = str.spilt(reg); -->调用spilt方法,实现对str字符串用reg正则 切割
二:
" +"-->切割一个或多个“空格” 如“yue hao tian” -->"yuehaotian"
"\\."-->切割点"."
"\\"-->切割单斜杠"\"
"\\\\"-->切割双斜杠"\\"
"(.)\\1"-->括号为组概念"."代表任意字符"\1"代表,使用第一组,
全意为:第一位开始,是任意字符,第二位开始,和第一位相同(即,切割一对相同字符)
如"abccde11a"-->"ab","de","a"
"(.)\\1+"--->全意为切割两个或两个以上相同字符
组演示:
((A)(B(C)))有四组:
|--((A)(B(C)))
|--\A
|--(B(C))
|--(C)
例(替换):
一:
String str = "ab1cd22e333f4";
String reg = "\\d(2,)" ;-->替换方式:将两个或两个以上数字
String newstr = "#"; --->替换为警号"#"
str = str.replaceAll(reg,newstr);-->调用replaceAll方法,传入参数
结果为:"ab1cd#e#f4"
二:
String reg = "(.)\\1+";-->将两个或两个以上相同字符
String newstr = "$1"; -->替换为组1的字符 $ 符合代表使用第几组
全意为: 将重复出现的字符,替换成一个
如:"abbbbccd"--->"abcd"
例(获取)
正则表达式:调用正则的原理 Pattern(正则对象) Matcher(匹配器)
String 类中的匹配,切割,替换,获取,都源自 Pattern类(正则对象),和 Matcher类(匹配器)
一(取出连续的4个字母)
String str = "ming tian yao fang jia";
String reg = "\\b[a-z]{4}\\b";-->"\b"是单词边界,全意为:只有4个字母时满足(第一位前和最后一位后,不能使字母)
Pattern p = Pattern.compile(reg); -->将规则封装成 正则对象
Matcher m = p.matcher(str); -->将正则对象和字符串str相关联,获取匹配器
while (m.find()) -->find方法:开始匹配,(即,执行)
{
System.out.println(m.group()); -->打印每次匹配的子串
System.out.println(m.start()+"--"+m.end()); -->打印子串的头角标位,和尾角标位
}
结果为: ming
0--4
tian
5--9
fang
14--18
注意::
m.matches();
while (m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"--"+m.end());
}
结果为: false -->matches方法:将全体字符串进行匹配(结果为false,因为ming后边还有内容,全体字符不等于4个,所以不匹配)
tian
5--9
fang
14--18
怎么没有打印 :ming
0--4
因为:matches方法,执行后,角标位已经不再0了,而在第4角标位上
这时再执行find,则从第4角标位开始查找,故没有打印ming
0--4
练习:将下面字符串转为:我要学编程
String str = "我我...我我....我要..要.....要要..要学........学学....学编...编程...程....程程程"
第一步:去掉"."
Str = str.replaceAll("\\.+","");
结果:"我我我我我要要要要要学学学学编编程程程程程"
第二步:将多个重复字符编程单个
Str = str.replaceAll("(.)\\1+","$1");
结果:我要学编程
练习二:将IP按数字大小,从小到大排列
String str = "192.168.0.244 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
第一步:将位数统一(如:192 2 -->192 002)这样才能比较
|--每串数字前都加两个零”00“:str = str.replaceAll("(\\d+)","00$1");
|--去除多余的零:str=str.replaceAll("0*(\\d{3})","$1");
第二步:按空格” “切割
String[] arr = str.split(" +"); -->一个或多个空格都切
第三部:排序
Tree<String> ts = new TreeSet<String>(); -->用Tree的自然排序
for(String s : arr)
{
ts.add(s);
}
第四步:去掉补位用的零
for(String s : ts)
{
s.replaceAll("0*(\\d+)","$1");
}
打印结果: 2.2.2.2
8.109.90.30
10.10.10
102.49.23.13
192.168.1.254
练习(对邮件地址进行校验)
String mail = "abc12@sina.com"
较为精确地匹配:
String reg = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"
简写:
String reg = "\\w+@\\w+(\\.\\w+)+";
练习(网页爬虫):资源获取器,如:获取某网页的邮箱地址
import java.io.*;
import java.util.regex.*;
import java.net.*;
class Demo
{
public static void main(String[] args)throws Exception
{
URL url = new URL("http://..网页.."); //将网页封装成URl对象
URLConnection conn = url.openConnection(); //获取服务端对象
BufferedReader bufin = new BufferedReader(new InputStreamReader(conn.getInputStream()));//获取网络输入流
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";//建立规则
Pattern p = Pattern.compile(mailreg); //将规则封装成正则对象
while ((line = bufin.readLine())!=null) //一行一行读取网络输入流数据
{
Matcher m = p.matcher(line); //每行数据都和正则对象,建立成匹配器
while (m.find()) //再执行匹配器,搜索匹配
{
System.out.println(m.group()); //将匹配的子串打印到控制
}
}
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------