黑马程序员_温习 正则表达式 (个人笔记)摘要(正则表达式-----网页爬虫)

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值