正则表达式HTMLParser使用详解.ppt
《正则表达式HTMLParser使用详解.ppt》由会员分享,可在线阅读,更多相关《正则表达式HTMLParser使用详解.ppt(80页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java正则表达式入门正则表达式入门+HTMLParser使用使用详解详解一、一、Java正则表达式入门正则表达式入门 众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。自从j
2、dk1.4推出包,就为我们提供了很好的JAVA正则表达式应用平台。说明说明转义符转义符af响铃符=x07换页符=x0C,换页符n响铃符=x07,换行(u000A)r回车符=x0D,回车(u000D)t制表符=x09,间隔(u0009)v垂直制表符=x0BeESC符=x1B,Escapex20使用两位十六进制表示形式,可与该编号的字符匹配u002B使用四位十六进制表示形式,可与该编号的字符匹配x20A060使用任意位十六进制表示形式,可与该编号的字符匹配说明说明字符字符$匹配输入字符串的开始位置。要匹配字符本身,请使用匹配输入字符串的结尾位置。要匹配“$”字符本身,请使用“$”()标记一个子表达
3、式的开始和结束位置。要匹配小括号,请使用(和)用来自定义能够匹配多种字符的表达式。要匹配中括号,请使用和修饰匹配次数的符号。要匹配大括号,请使用和.匹配除了换行符(n)以外的任意一个字符。要匹配小数点本身,请使用.?修饰匹配次数为0次或1次。要匹配?字符本身,请使用?+修饰匹配次数为至少1次。要匹配+字符本身,请使用+*修饰匹配次数为0次或任意次。要匹配*字符本身,请使用*|左右两边表达式之间或关系。匹配|本身,请使用|说明说明字符集合字符集合.w小数点可以匹配除了换行符(n)以外的任意一个字符可以匹配任何一个字母或者数字或者下划线,单独字符a-zA-Z_0-9WW大写,可以匹配任何一个字母或
4、者数字或者下划线以外的字符,非单独字符a-zA-Z_0-9s可以匹配空格、制表符、换页符等空白字符的其中任意一个,空白符号tnx0BfrSS大写,可以匹配任何一个空白字符以外的字符,非空白符号tnx0Bfrd可以匹配任何一个09数字字符,数字等价于0-9DD大写,可以匹配任何一个非数字字符,非数字等价于0-9字符集合字符集合可以匹配“多个字符”其中任意一个字符的正则表达式。虽然是“多个字符”,但每次只能匹配其中一个。DEELX正则表达式中标准的字符集合有:说明说明限定符限定符nm,n表达式固定重复n次,比如:w2相当于ww表达式尽可能重复n次,至少重复m次:ba1,3可以匹配ba或baa或ba
5、aam,表达式尽可能的多匹配,至少重复m次:“wd2,”可以匹配a12,x456.?表达式尽可能匹配1次,也可以不匹配,相当于0,1+表达式尽可能的多匹配,至少匹配1次,相当于1,*表达式尽可能的多匹配,最少可以不匹配,相当于0,匹配次数限定符匹配次数限定符使被修饰的表达式可多次重复匹配的修饰符。可使被修饰的表达式重复固定次数,也可以限定一定的重复匹配的次数范围。在限定符之后的表达式能够匹配成功的情况下,不定次数的限定符总是尽可能的多匹配。如果之后的表达式匹配失败,限定符可适当“让出”能够匹配的字符,以使整个表达式匹配成功。这种模式就叫“贪贪婪模式婪模式”。说明说明限定符限定符m,n?m,?表
6、达式尽量只匹配m次,最多重复n次。表达式尽量只匹配m次,最多可以匹配任意次。?表达式尽量不匹配,最多匹配1次,相当于0,1?+?表达式尽量只匹配1次,最多可匹配任意次,相当于1,?*?表达式尽量不匹配,最多可匹配任意次,相当于0,?“勉强模式勉强模式”限定符:限定符:在限定符之后添加问号(?),则使限定符成为“勉强模式”。勉强模式的限定符,总是尽可能少的匹配。如果之后的表达式匹配失败,勉强模式也可以尽可能少的再匹配一些,以使整个表达式匹配成功。说明说明限定符限定符m,n+m,+表达式尽可能重复n次,至少重复m次。表达式尽可能的多匹配,至少重复m次。?+表达式尽可能匹配1次,也可以不匹配,相当于
7、0,1+表达式尽可能的多匹配,至少匹配1次,相当于1,+*+表达式尽可能的多匹配,最少可以不匹配,相当于0,+“占有模式占有模式”限定符:限定符:在限定符之后添加加号(+),则使限定符成为“占有模式”。占有模式的限定符,总是尽可能多的匹配。与“贪婪模式”不同的是,即使之后的表达式匹配失败,“占有模式”也不会“让出”自己能够匹配的字符。转义字符转义字符 Q.EQ.E使用Q开始,E结束,可使中间的标点符号失去特殊意义,将中间的字符作为普通字符。例如:Q(a+b)*3E可匹配文本“(a+b)*3”。因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。b一个单词
8、的边界B一个非单词的边界G前一个匹配的结束为限制开头java条件限制为以Java为开头字符$为限制结尾java$条件限制为以java为结尾字符.条件限制除n以外任意一个单独字符java.条件限制为java后除换行外任意两个字符加入特定限制条件a-z条件限制在小写atoz范围中一个字符A-Z条件限制在大写AtoZ范围中一个字符a-zA-Z条件限制在小写atoz或大写AtoZ范围中一个字符0-9条件限制在小写0to9范围中一个字符0-9a-z条件限制在小写0to9或atoz范围中一个字符0-9a-z条件限制在小写0to9或atoz范围中一个字符(交集)中加入后加再次限制条件a-z条件限制在非小写a
9、toz范围中一个字符A-Z条件限制在非大写AtoZ范围中一个字符a-zA-Z条件限制在非小写atoz或大写AtoZ范围中一个字符0-9条件限制在非小写0to9范围中一个字符0-9a-z条件限制在非小写0to9或atoz范围中一个字符0-9a-z条件限制在非小写0to9或atoz范围中一个字符(交集)在限制条件为特定字符出现限制条件为特定字符出现0次以上时,可以使用次以上时,可以使用*J*0个以上J.*0个以上任意字符J.*DJ与D之间0个以上任意字符在限制条件为特定字符出现1次以上时,可以使用+J+1个以上J.+1个以上任意字符J.+DJ与D之间1个以上任意字符在限制条件为特定字符出现有0或1
10、次以上时,可以使用?JA?J或者JA出现限制为连续出现指定次数字符aJ2JJJ3JJJ文字a个以上,并且a,J3,JJJ,JJJJ,JJJJJ,?(3次以上J并存)文字个以上,b个以下a,bJ3,5JJJ或JJJJ或JJJJJ两者取一|J|AJ或AJava|HelloJava或Hello()中规定一个组合类型比如,我查询index中间的数据,可写作+href=?(*)?*(.+?)在使用Ppile函数时,可以加入控制正则表达式的匹配行为的参数:PatternPpile(Stringregex,intflag)flag的取值范围如下:Pattern.CANON_EQ当且仅当两个字符的正规分解(c
11、anonicaldecomposition)都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式au030A会匹配?。默认情况下,不考虑规范相等性(canonicalequivalence)。Pattern.CASE_INSENSITIVE(?i)默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。Pattern.COMMENTS(?x)在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的s,而是指表达式里的空格,
12、tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。Pattern.DOTALL(?s)在这种模式下,表达式.可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式.不匹配行的结束符。Pattern.MULTILINE(?m)在这种模式下,和$分别匹配一行的开始和结束。此外,仍然匹配字符串的开始,$也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。Pattern.UNICODE_CASE(?u)在这个模式下,如果你还启用了CASE_INSENSITIVE*标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小
13、写不敏感的匹配只适用于US-ASCII字符集。Pattern.UNIX_LINES(?d)在这个模式下,只有n才被认作一行的中止,并且与.,以及$进行匹配。抛开空泛的概念,下面写出几个简单的Java正则用例:比如,在字符串包含验证时/查找以Java开头,任意结尾的字符串Patternpattern=Ppile(Java.*);Matchermatcher=pattern.matcher(Java不是人);booleanb=matcher.matches();/当条件满足时,将返回true,否则返回falseSystem.out.println(b);以多条件分割字符串时Patternpatte
14、rn=Ppile(,|+);Stringstrs=pattern.split(JavaHelloWorldJava,Hello,World|Sun);for(inti=0;istrs.length;i+)System.out.println(strsi);文字替换(首次出现字符)Patternpattern=Ppile(正则表达式);Matchermatcher=pattern.matcher(正则表达式HelloWorld,正则表达式HelloWorld);/替换第一个符合正则的数据System.out.println(matcher.replaceFirst(Java);文字替换(全部)P
15、atternpattern=Ppile(正则表达式);Matchermatcher=pattern.matcher(正则表达式HelloWorld,正则表达式HelloWorld);/替换第一个符合正则的数据System.out.println(matcher.replaceAll(Java);文字替换(置换字符)Patternpattern=Ppile(“正则表达式”);Matchermatcher=pattern.matcher(“正则表达式HelloWorld,正则表达式HelloWorld”);StringBuffersbr=newStringBuffer();while(matche
16、r.find()matcher.appendReplacement(sbr,“Java”);matcher.appendTail(sbr);System.out.println(sbr.toString();验证是否为邮箱地址Stringemail=“w.-+(w-+.)+w-+”;Stringstr=”;Patternpattern=Ppile(email,Pattern.CASE_INSENSITIVE);Matchermatcher=pattern.matcher(str);System.out.println(matcher.matches();比较严格的:email=(0-9a-zA
17、-Z(-.w*0-9a-zA-Z)*(0-9a-zA-Z)+(-w*0-9a-zA-Z)*.)+a-zA-Z2,9)$去除html标记Patternpattern=Ppile(,Pattern.DOTALL);Matchermatcher=pattern.matcher(主页);Stringstring=matcher.replaceAll();System.out.println(string);查找html中对应条件字符串Patternpattern=Ppile(href=(.+?);Matchermatcher=pattern.matcher(主页);if(matcher.find()S
18、ystem.out.println(matcher.group(1);截取http:/地址/截取urlPatternpattern=Ppile(http:/|https:/)1w.-/:+);Matchermatcher=pattern.matcher(dsdsdsfdf);StringBufferbuffer=newStringBuffer();while(matcher.find()buffer.append(matcher.group();buffer.append(rn);System.out.println(buffer.toString();替换指定中文字Stringstr=Jav
19、a目前的发展史是由0年-1年;Stringobject=newString0,1995,newString1,2007;System.out.println(replace(str,object);publicstaticStringreplace(finalStringsourceString,Objectobject)Stringtemp=sourceString;for(inti=0;iobject.length;i+)Stringresult=(String)objecti;Patternpattern=Ppile(result0);Matchermatcher=pattern.mat
20、cher(temp);temp=matcher.replaceAll(result1);returntemp;读取页面链接和内容:publicStringnewsListRegExp=+href=?(*)?*(.+?);newsListRegExp=+hrefs*=*s*(s|+)*(n*);publicvoidgetLinks(Stringcontent)pattern=java.util.regex.Ppile(newsListRegExp,java.util.regex.Pattern.CASE_INSENSITIVE);matcher=pattern.matcher(content);
21、while(matcher.find()Stringlink=matcher.group(1);Stringtext=matcher.group(2);System.out.println(link+text);Java正则的功用还有很多,事实上只要是字符处理,就没有正则做不到的事情存在。(当然,正则解释时较耗时间就是了!)二、二、HTMLParser使用详解使用详解HTMLParser使用详解(使用详解(1)-初始化初始化Parser在研究搜索引擎的开发中,对于HTML网页的处理是核心的一个环节。网上有很多开源的代码,对于Java来说,HTMLParser是比较著名并且得到广泛应用的一个。H
22、TMLParser的主页是http:/,最后的更新是2006年9月的1.6版。不过没关系,HTML的内容已经很久没有大的变化了,HTMLParser处理起来基本没有任何问题。HTMLParser的核心模块是类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:publicParser();publicParser(Lexerlexer,ParserFeedbackfb);publicParser(URLConnectionconnection,ParserFeedbackfb)throwsParserException;publicParser(Stringresource
23、,ParserFeedbackfeedback)throwsParserException;publicParser(Stringresource)throwsParserException;publicParser(Lexerlexer);publicParser(URLConnectionconnection)throwsParserException;和一个静态类publicstaticParsercreateParser(Stringhtml,Stringcharset);对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Pars
24、er,或者使用静态函数来生成一个Parser对象。ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。对于大多数中文页面来说,好像这是应该用得比较多的一个方法。HTMLParser使用详解(使用详解(2)-Node内容内容HTMLParser将解析过的信息保存为一个树的结构。Node是信息保存的数据类型基础。请看Node的定义:publicinterfaceNodeextendsCloneable;Nod
25、e中包含的方法有几类:中包含的方法有几类:对于树型结构进行遍历的函数,这些函数最容易理对于树型结构进行遍历的函数,这些函数最容易理解:解:NodegetParent():取得父节点NodeListgetChildren():取得子节点的列表NodegetFirstChild():取得第一个子节点NodegetLastChild():取得最后一个子节点NodegetPreviousSibling():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)NodegetNextSibling():取得下一个兄弟节点取得取得Node内容的函数:内容的函数:Stringg
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则 表达式 HTMLParser 使用 详解
限制150内