1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

时间:2022-03-27 03:24:03

简介

本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用。在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA代码,实现一个支持常用功能的正则表达式引擎。它支持贪婪匹配和懒惰匹配;支持零宽度字符(如“\b”, “\B”);支持常用字符集(如“\d”, “\s”等);支持自定义字符集(“[a-f]”,“[^b-k] ”等);支持所有重复操作(“*”,“+”,“?”,“{n,m}”等);支持通配符(“. ”);支持运算符本身的转义字符(“\*”,“\.”等);支持命名捕获组。本系列博客的目的是理解正则表达式的内部工作原理,所以没有考虑正则表达式引擎的工作效率以及正负断言和非命名捕获组等不常用的功能,后续的工作将会对其优化并完备其功能。由于正则表达式引擎的实现需要运用数据结构中的相关内容,阅读本系列博客前请熟悉栈,队列,图以及JAVA中容器等相关知识。

欢迎探讨,如有错误敬请指正

如需转载,请注明出处 http://www.cnblogs.com/nullzx/


1. 正则表达式的作用

正则表达式的功能就是在文本串中搜索特定模式的字符串。我们以下面方框中豆瓣电影网页中给出的信息为例,我们想在这些文本中找出所有的日期信息,我们发现日期信息的字符格式在以下文本串中具有特定的格式,都是xxxx-xx-xx的模式(比如2017-01-27),这里的x表示一个具体的数字。所以我们搜索的字符串的格式就是“\d{4}-\d{2}-\d{2}”,在正则表达式中\d表示数字,{n}表示重复n次。

猜火车2

猜火车2 / 迷幻列车2(港) / T2:Trainspotting

2017-01-27(英国) / 伊万·麦克格雷格 / 约翰尼·李·米勒 / 罗伯特·卡莱尔 / 艾文·布莱纳 / 雪莉·亨德森 / 安杰拉·奈迪亚科娃 / 史蒂文·罗伯特森 / 戈登·肯尼迪 / 西蒙·韦尔 / 詹姆斯·卡沙莫 / 梁佩诗 / 阿塔·雅谷伯 / 埃文·威尔什 /...

...

...

...

7.8 (5392人评价)

宝贝老板

宝贝老板 / 娃娃老板 / 波士BB(港)

2017-03-12(迈阿密电影节) / 2017-03-31(美国) / 亚历克·鲍德温 / 迈尔斯·克里斯托弗·巴克什 / 吉米·坎摩尔 / 丽莎·库卓 / 史蒂夫·布西密 / 托比·马奎尔 / 詹姆斯·麦格拉思 / 康拉德·弗农 / 薇薇安·叶 / 小埃里克·贝尔 / 大卫·索伦 / 伊迪·米尔曼...

8.3 (184408人评价)

逃出绝命镇

逃出绝命镇 / 访吓(港)

2017-01-23(圣丹斯电影节) / 2017-02-24(美国) / 丹尼尔·卡卢亚 / 艾莉森·威廉姆斯 / 凯瑟琳·基纳 / 布莱德利·惠特福德 / 卡赖伯·兰德里·琼斯 / 马库斯·亨德森 / 贝蒂·加布里埃尔 / 勒凯斯·斯坦菲尔德 / 斯蒂芬·鲁特 / 李雷尔·哈瓦瑞...

7.5 (51576人评价)

由于排版的需要,以上文本框中的内容比下图实际处理数据中的内容为基础进行了删减

我们通过正则表达式测试工具进行文本串中特定模式串\d{4}-\d{2}-\d{2}匹配,结果如下图所示 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

通过得到的处理结果,我们搜索到了文本串中所有的日期信息。从这个例子我们可以看出正则表达式引擎的主要功能就是在给定的文本串中搜索符合正则表达规则的特定模式的字符串,而这个特定的模式是我们通过分析文本串中感兴趣的信息总结得到的一般规律。比如要得到文本中电影的评分,字符串的格式就是“\d.\d”。

除了上述例子外,正则表达式还有很多应用。例如,在注册用户时,验证用户输入的邮箱是否合法;在网络爬虫技术中,爬取我们感兴趣的相关内容;编译器设计中,我们还可以将正则表达式作为词法分析器,等等。使用正则表达式能够使我们更方便,更加高效的解决字符串模式匹配的相关问题,而不必为每一个问题单独写一个程序。这里我们所说的效率高,是指编写程序的效率更高,而非程序的运行效率。

我们的目的是写一个正则表达式引擎,所以我们接下来就非常有必要了解一下正则表达式的一般规则。