Java正则表达式 宋仲春.

Slides:



Advertisements
Similar presentations
輔導處八月份主管會報 報告人 : 洪自強. 輔導組本月工作 【行政文書】 建置 100 學年度工作資料夾 擬訂 100 學年度第一學期行事曆 【認輔工作】 匯整 100 學年度續接個案資料 輔導教師持續關心責任班級高關懷個案 統整國小轉銜個案資料 (3 位 ) 【通報案件】 通報性騷擾案件 1 件.
Advertisements

西南政法大学图书馆 江波 重庆. 传统图书馆自动化图书馆复合图书馆数字图书馆  图书馆为图书流通服务所制定的相关规则,包 括图书流通类型、读者类型、读者可借阅图书 数量、可借阅时间、可续借时间、可续借次数、 可预约数量等。
醫學美學之我見ー肉毒桿菌 班級:應日三乙 姓名:蔡雅卉 學號: 497E0076. 前言 現在的人,已經把 整型看做是微不足 道的事情了。即使 只是戴牙套、局部 雷射、割雙眼皮、 打美白針、肉毒桿 菌等等,都可以在 身體上做不同的改 變,而讓自己更滿 意自己的外表。
當我已老 謹以此文獻給像我一樣流浪在外的子女們.
第二节 交通运输布局变化的影响 北京市第十一中学 张芊丽 2008年1月.
第五十章 旅外华人现代汉语文学 回目录.
2015年12月14日-2015年12月20日 缩略版.
自然與生活科技領域 國中1上 第2單元 生命的維持(一) 生物體的協調 6-1 神經系統 6-2 內分泌系統.
区位因素分析专题.
指導老師:羅夏美 組別:第四組 組員: 車輛二甲 蔡中銘 車輛三甲 莊鵬彥 國企二甲 陳于甄 國企二甲 詹雯晴 資傳二乙 林怡芳
文题: (1)请以“从此,我(他/她)不再________”为题,写一篇不少于600字的记叙文。 (2)以“做人从_____开始” 为题,写一篇不少于600字的文章。 (3)请以“你还会____吗”为题写一篇600字以上的文章,文体不限,诗歌除外。
第八章   股利分配 本章主要介绍了影响股利政策的因素、主要的股利政策、股利支付的程序及方式、 股票分割及股票回购等问题。通过本章的学习,要求掌握不同股利政策的具体做法,掌握股票股利的作用,了解股票分割和股票回购的涵义及影响。
导入新课 俄罗斯首任总统叶利钦.
1Z 会计基础与财务管理 1Z 会计的职能与核算方法 …2011 会计的职能(熟悉) 一、会计的概念
C语言程序设计 李伟光.
文明史范式.
金陵科技学院·思想政治理论课教学部 思想道德修养与法律基础 “基础”教研室.
教學經驗分享 吳毅成 國立交通大學資訊工程系 2012年4月.
讲故事训练 授课人:田轶.
脾胃病的饮食调理和中医治疗 贵州省中医院脾胃病肝病内科 医生:朱国琪.
学校消防安全培训.
审计案例研究 第一讲 辅导教师 周桂芝.
教育老兵教學經驗談 何進財 曾任 教育部社教司司長 訓委會常務委員 中央警官學校兼任講師 台北市立師範學院兼任副教授 國立陽明大學兼任副教授
九十二年度第二次 會計作業實務座談會 主辦單位:會計室.
第十一課 菜園 6-11.
龙腾炎盛鞋业 打造卓越管理人员特训营.
二十世纪外国文学专题 章丘电大 李颜.
萬獸之王 獅子.
教育的“麦田”,我们该如何守望? ——读《麦田里的守望者》 王振中 二0一二年九月二十六日.
第八章 海岸地貌 海南三亚天涯海角.
马克思主义基本原理概论 上海理工大学社会科学学院 张欢欢.
七年级历史上册 第二单元 国家产生和社会的变革.
第四章 会计职业道德 第三节 会计职业道德教育.
校本选修课 第三专题 西藏问题 北京师大二附中 李文燕.
第四节 世界的聚落 鸭暖中学地理备课组 学习目标 聚落的主要形式 了解 聚落的形成和发展 世界文化遗产 探索 聚落的形成和发展 环保意识 增强 人地协调发展的环境观.
纳税是有收入的成年人的事,与我们中学生无关。
JavaScript中常用的互動方式 認識簡單的交談與基本的運算.
三餐煮飯佬蕃薯、傍係鹹菜佬菜脯, 日子過得實在艱苦。 頭擺頭擺有一介細阿妹, 按到「梅英姐」,屋下當苦,
“网络问政”给九江新闻网 带来新的发展机遇 -- 九江新闻网 高立东 --.
信 息 与 软 件 工 程 学 院 实验室开放实验介绍.
歷史的耶穌 普通話學人之家 June 21, 2003.
形式语言与自动机 第四章 正则表达式 南京航空航天大学 计算机科学与技术学院 关东海
營建自動化 -營建管理資訊化 授課老師:劉俊杰 副教授 中華民國89年9月27日.
正修科技大學教學發展中心 教師教學觀摩與經驗分享 電子工程系 張法憲副教授.
8.1 系統軟件、應用軟件和驅動程序 電腦軟件 是使電腦處理指定工作的一連串指令 大致可分大為三類: 驅動程序 系統軟件 應用軟件.
触电预防与急救 杜芳艳.
社会工作概论 个案工作 课程培训 深圳电大 赖小乐.
前言.
科學科 污染 空氣 成因 的 : 題目 及 減少空氣污染的方法 陳玉玲 (4) 姓名 : 去到目錄.
蘇軾詞的賞析
关于英语教学中课外阅读的教学反思 上海市中职英语中心组 沈毅.
柯奕宏(06) 王予亨(13) 郭秉逸(15) 楊雯凈(23) 顏佑瑩(32)
年中国软件技术 应用现状和趋势分析 IT168 调研中心调研总监 卢军 2007年1月20日.
第十五章 传播学调查研究方法.
自然與生活科技領域 認識太陽能 蘇紋琪、石明玉.
 全能的天才畫家- 李奧納多‧達文西 (西元1452年-1519年) 指導老師:袁淑芬老師 製作人:饒佩芯.
辅导课程十三.
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
認識我的故鄉_台中市.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
主讲:陶建平 华中科技大学网络与计算中心
精忠报国  演唱:屠洪纲 作词:陈涛 作曲:张宏光  狼烟起 江山北望  龙起卷 马长嘶 剑气如霜  心似黄河水茫茫  二十年 纵横间 谁能相抗  恨欲狂 长刀所向  多少手足忠魂埋骨它乡  何惜百死报家国  忍叹惜 更无语 血泪满眶  马蹄南去 人北望  人北望 草青黄 尘飞扬  我愿守土复开疆  堂堂中国要让四方来贺.
目次检索 打印 下载 文字摘录 更换背景 多窗口阅读.
樂樂請假了 尊重的故事 資料來源:臺北縣國民小學品德教育手冊 故事來源:臺北縣國民小學品德教育手冊 網路小故事
聽聽那冷雨---重點摘要 二愛 王煜榕.
憲政與民主 應化3A 邱泓明.
方格紙上畫正方形.
古蹟知性之旅 我和新港奉天宮有個約 報告人:陳 映 竹 傅 湘 甯.
年中国软件技术 应用现状和趋势分析.
電子表單 簡介 高雄市鳳山區新甲國小 陳信宏.
Presentation transcript:

Java正则表达式 宋仲春

早期起源 正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。 1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。 随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。 如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。

重要声明 许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能 Java正则表达式不是javascript正则表达式

Java正则表达式优点 使用java正则表达式与传统编程相比 优点: 在判断EMAIL等传统编程方法可能需要一二十行代码,使用正则表达式只需几行代码而已 提高编程效率 弊端: 需要学习java正则表达式的用法。

基础知识部份 开始java正则表达式的基础知识

正则表达式基础知识 我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说:

1.1 句点符号 假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:

1.2 方括号符号 句点优点是通用,同时缺点也是通用 为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符 .方括号表示可能出现的单个字符

1.3 “或”符号 句点和方括号只匹配单个字符,如果要匹配多个字符就要看”或”运算符了 如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。圆括号还可以用来分组,具体请参见后面介绍。

1.4.1 表示匹配次数的符号 遇到单个字符的重复问题,就要看下面的符号表了 表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

1.4.2常用符号小结1 句点.表示单个字符 方括号[]表示可能出现字符集里的单个字符 括号()可表示多个字符 大括号{}表示次数 转义字符“\” 一般正则表达式是由通配符和固定字符组成

1.4.3实例1 假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。 看看下面那一行正则表达式是对的: (0-9){3} \-(0-9){2} \- (0-9){4} [0-9]{3} \-[0-9]{2} \- [0-9]{4} 正确的是: 图:匹配所有123-12-1234形式的社会安全号码

1.4.4实例2 假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上一个数量限定符号,如图所示: 看看下面那一行正则表达式是对的: (0-9){3} \-?(0-9){2} \-? (0-9){4} [0-9]{3} \-*[0-9]{2} \-* [0-9]{4} 正确的是: 图:匹配所有123-12-1234和123121234形式的社会安全号码

1.4.5实例3 下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。图显示了完整的正则表达式。 图:匹配典型的美国汽车牌照号码,如8836KV

1.5 “否”符号 “^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。 图:匹配所有单词,但“X”开头的除外

1.6.1 圆括号和空白符号 假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图所示: 看看下面哪一个是正确的: [a-z]* \s+ [0-9]{1,2},\s* [0-9]{4} [a-z]+ \s+ [0-9]{1,2},\s* [0-9]{4} 正确的是: 图:匹配所有Moth DD,YYYY格式的日期

1.6.2 圆括号和空白符号 新出现的“\s”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API(本文后面详细讨论)提取出它的值。修改后的正则表达式如图所示: 图:匹配所有Month DD,YYYY格式的日期,定义月份值为第一个组

1.7.1 其它符号 为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。如表二所示: 表二:常用符号

1.7.2 其它符号 例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“\d”。修改后的正则表达式如图所示: 图:匹配所有123-12-1234格式的社会安全号码

1.8常用符号总结 句点.表示单个字符 方括号[]表示可能出现字符集里的单个字符 括号()可表示多个字符,还有分组功能 大括号{}表示次数 转义字符“\” 一般正则表达式是由通配符和固定字符组成 ^”符号称为“否”符号 \d \D \w \W \s \S等快捷符号

实战部份 开始java正则表达式的实战讲解部份

Jakarta-ORO库 有许多源代码开放的正则表达式库可供Java程序员使用,有许多支持Perl 5兼容的正则表达式语法。这里选用的是Jakarta-ORO正则表达式库,它是最全面的正则表达式API之一,而且它与Perl 5正则表达式完全兼容。它也是优化得最好的API之一。 Jakarta-ORO库以前叫做OROMatcher,Daniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下载它。 我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用Jakarta-ORO API。

实战思路 PatternCompiler 根据用户写的正则表达式生(编译成)Pattern, PatternMatcher比较器匹配Pattern和InputString,再返回真或假 思路有点类似于java编译器把*.java编译成*.class 再由jvm加载执行 根据正则表达式生成 PatternCompiler Pattern InputString PatternMatcher比较器匹配 Patten和InputString 返回True 或者 false

PatternCompiler对象 首先,创建一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现,允许你把正则表达式编译成用来匹配的Pattern对象。

Pattern对象 要把正则表达式编译成Pattern对象,调用compiler对象的compile()方法,并在调用参数中指定正则表达式。例如,你可以按照下面这种方式编译正则表达式“t[aeio]n”:

Pattern对象续 默认情况下,编译器创建一个大小写敏感的模式(pattern)。因此,上面代码编译得到的模式只匹配“tin”、“tan”、 “ten”和“ton”,但不匹配“Tin”和“taN”。要创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数: 创建好Pattern对象之后,你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。

PatternMatcher对象 PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现,它根据Perl 5正则表达式语法进行模式匹配:

介绍匹配的几种方法 使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串: boolean matches(String input, Pattern pattern):当输入字符串和正则表达式要精确匹配时使用。换句话说,正则表达式必须完整地描述输入字符串。 boolean matchesPrefix(String input, Pattern pattern):当正则表达式匹配输入字符串起始部分时使用。(例如正则表达式abc 匹配abc1或abc2) boolean contains(String input, Pattern pattern):当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一个子串)。 另外,在上面三个方法调用中,你还可以用PatternMatcherInput对象作为参数替代String对象;这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时,用PatternMatcherInput对象作为参数就很有用了。用PatternMatcherInput对象作为参数替代String时,上述三个方法的语法如下: boolean matches(PatternMatcherInput input, Pattern pattern) boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) boolean contains(PatternMatcherInput input, Pattern pattern)

应用实例 应用实例介绍开始

1.日志文件处理 任务:分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中,日志记录的格式如下 分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:IP地址和页面访问时间。你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。 首先我们来看看IP地址。IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。因此,IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式: 图:匹配IP地址

1.日志文件处理-续 IP地址中的句点字符必须进行转义处理(前面加上“\”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。 日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。 图:匹配至少一个字符,直至找到“]” 现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。注意,为了匹配“- -”(但不提取它),正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如下图所示。 图:匹配IP地址和时间标记

1.日志文件处理-续 现在正则表达式已经编写完毕,接下来可以编写使用正则表达式库的Java代码了。 为使用Jakarta-ORO库,首先创建正则表达式字符串和待分析的日志记录字符串: 这里使用的正则表达式与前一页图的正则表达式差不多完全相同,但有一点例外:在Java中,你必须对每一个向前的斜杠(“\”)进行转义处理。前一页图不是Java的表示形式,所以我们要在每个“\”前面加上一个“\”以免出现编译错误。遗憾的是,转义处理过程很容易出现错误,所以应该小心谨慎。你可以首先输入未经转义处理的正则表达式,然后从左到右依次把每一个“\”替换成“\\”。如果要复检 ,你可以试着把它输出到屏幕上。

1.日志文件处理-续 初始化字符串之后,实例化PatternCompiler对象,用PatternCompiler编译正则表达式创建一个Pattern对象: 现在,创建PatternMatcher对象,调用PatternMatcher接口的contain()方法检查匹配情况:

1.日志文件处理-续 接下来,利用PatternMatcher接口返回的MatchResult对象,输出匹配的组。由于logEntry字符串包含匹配的内容,你可以看到类如下面的输出:

2 .HTML处理实例一 下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FONT标记如下所示: 在这种情况下,我建议你使用两个正则表达式。第一个如图下所示,它从字体标记提取出“"face="Arial, Serif" size="+2" color="red"”。 图:匹配FONT标记的所有属性

2 .HTML处理实例一续 第二个正则表达式如图十二所示,它把各个属性分割成名字-值对。 图:匹配单个属性,并把它分割成名字-值对 分割结果为:

2 .HTML处理实例一续 现在我们来看看完成这个任务的Java代码。首先创建两个正则表达式字符串,用Perl5Compiler把它们编译成Pattern对象。编译正则表达式的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项,使得匹配操作不区分大小写。 接下来,创建一个执行匹配操作的Perl5Matcher对象。

2 .HTML处理实例一续 假设有一个String类型的变量html,它代表了HTML文件中的一行内容。如果html字符串包含FONT标记,匹配器将返回true。此时,你可以用匹配器对象返回的MatchResult对象获得第一个组,它包含了FONT的所有属性

2 .HTML处理实例一续 接下来创建一个PatternMatcherInput对象。这个对象允许你从最后一次匹配的位置开始继续进行匹配操作,因此,它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象,以参数形式传入待匹配的字符串。然后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象(而不是字符串对象)为参数,反复地调用PatternMatcher对象的contains()方法完成。PatternMatcherInput对象之中的每一次迭代将把它内部的指针向前移动,下一次检测将从前一次匹配位置的后面开始。 本例的输出结果如下:

3 HTML处理实例二 下面我们来看看另一个处理HTML的例子。这一次,我们假定Web服务器从widgets.acme.com移到了newserver.acme.com。现在你要修改一些页面中的链接: 执行这个搜索的正则表达式如图所示: 图:匹配修改前的链接

3 HTML处理实例二续 如果能够匹配这个正则表达式,你可以用下面的内容替换图的链接: 注意#字符的后面加上了$1。Perl正则表达式语法用$1、$2等表示已经匹配且提取出来的组。图十三的表达式把所有作为一个组匹配和提取出来的内容附加到链接的后面。 现在,返回Java。就象前面我们所做的那样,你必须创建测试字符串,创建把正则表达式编译到Pattern对象所必需的对象,以及创建一个PatternMatcher对象

3 HTML处理实例二续 接下来,用com.oroinc.text.regex包Util类的substitute()静态方法进行替换,输出结果字符串: Util.substitute()方法的语法如下:

3 HTML处理实例二续 这个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象,它决定了替换操作如何进行。本例使用的是Perl5Substitution对象,它能够进行Perl5风格的替换。第四个参数是想要进行替换操作的字符串,最后一个参数允许指定是否替换模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替换指定的次数。

结束语 【结束语】在这篇文章中,我为你介绍了正则表达式的强大功能。只要正确运用,正则表达式能够在字符串提取和文本修改中起到很大的作用。另外,我还介绍了如何在Java程序中通过Jakarta-ORO库利用正则表达式。至于最终采用老式的字符串处理方式(使用StringTokenizer,charAt,和substring),还是采用正则表达式,这就有待你自己决定了。 参考资料 http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp

谢谢