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

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

2013-12-16 22:39 477 查看
---------------------- <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>、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐