1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用
简介:
本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及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}匹配,结果如下图所示
通过得到的处理结果,我们搜索到了文本串中所有的日期信息。从这个例子我们可以看出正则表达式引擎的主要功能就是在给定的文本串中搜索符合正则表达规则的特定模式的字符串,而这个特定的模式是我们通过分析文本串中感兴趣的信息总结得到的一般规律。比如要得到文本中电影的评分,字符串的格式就是“\d.\d”。
除了上述例子外,正则表达式还有很多应用。例如,在注册用户时,验证用户输入的邮箱是否合法;在网络爬虫技术中,爬取我们感兴趣的相关内容;编译器设计中,我们还可以将正则表达式作为词法分析器,等等。使用正则表达式能够使我们更方便,更加高效的解决字符串模式匹配的相关问题,而不必为每一个问题单独写一个程序。这里我们所说的效率高,是指编写程序的效率更高,而非程序的运行效率。
我们的目的是写一个正则表达式引擎,所以我们接下来就非常有必要了解一下正则表达式的一般规则。
1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用的更多相关文章
- 正则表达式概述与JAVA中正则表达式的应用
编程或者电脑使用过程中,经常需要对字符串进行 匹配,查找,替换,判断.如果单纯用代码 if () ,whlie 什么的进行比较复杂麻烦.正则表达式是一种强大灵活的文本处理工具,专门对字符串进行匹配,查 ...
- (转)如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器
原文地址:http://www.dranger.com/ffmpeg/ FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码. ...
- Java中正则表达式的使用(常用的方法)
这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...
- java中正则表达式基本用法
正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java中正则表达式去除html标签
Java中正则表达式去除html的标签,主要目的更精确的显示内容,比如前一段时间在做类似于博客中发布文章功能,当编辑器中输入内容后会将样式标签也传入后台并且保存数据库,但是在显示摘要的时候,比如显示正 ...
- java中正则表达式基本用法(转)
https://www.cnblogs.com/xhj123/p/6032683.html 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符( ...
- JAVA中正则表达式学习总结
一.JAVA中正则表达式相关的类 1. java.util.regex.Pattern 该类用于编译模式,模式可以理解为一个正则表达式,比如:a*b. 用法如下: // 创建模式 Pattern p ...
- JAVA中正则表达式常用的四个方法
JAVA中正则表达式处理字符串的四个常用方法:匹配.分割.替换.截取.其跟字符串的常用函数相似,但是使用正则表达式会更简单.更加简洁.下面是具体的例子: public class TestRegex ...
随机推荐
- 如何将网站升级为HTTPS协议?
基本概念: HTTP: 是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准,用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HT ...
- 【网站管理3】_ftp连接超时和连不上的原因
1.无法上传网页,FTP故障-提示"无法连接服务器"错误. 问题出现原因:FTP客户端程序设置问题,客户上网线路问题,ftp服务器端问题.处理方法:建议客户使用CUTPFTP软件来 ...
- hdu4597 Play Game 区间DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 全国邀请赛通化赛区第8题--题目重现 思路: 区间DP的思想,想法是队友想出来的,感觉很秒,自己 ...
- .NET面试题系列[16] - 多线程概念(1)
.NET面试题系列目录 这篇文章主要是各个百科中的一些摘抄,简述了进程和线程的来源,为什么出现了进程和线程. 操作系统层面中进程和线程的实现 操作系统发展史 直到20世纪50年代中期,还没出现操作系统 ...
- struts的package的name与namespace
<struts> <constant name="struts.devMode" value="true"></constant& ...
- 区块链入门(1):搭建(Ubuntu系统)Truffle v3.2.1 开发和测试环境
本文主要讲解ubuntu 16.04下, truffle开发测试环境的搭建. 第一步:安装nodejs 和 npm,有两种比较常见的方法. 方法1:直接在nodejs官网下载nodejs-v6.10 ...
- sublime Text3 新建文件时定义模块
开发的过程中有很多的东西,不需要每次编写,如果每次编写这样会很蛋疼,所以sublime 提供了一个牛逼的插件SublimeTmpl, 这个插件可以定义自己新建的模块. sublimeTmpl 安装 1 ...
- python 分片
有些书中叫做分片,有些书中叫做切片,翻译时的一些误差) 概念:将序列按段进行切割 作用:通过分片操作符来访问一定范围内的元素 实现:分片是通过两个冒号相隔的索引来实现 范围:符合序列特性即可使用切片功 ...
- 扫描soa并输出所有服务方法
现在,大多公司都采用soa架构.那么我们怎么知道soa提供哪些服务方法呢?是通过浏览器不断的点击尝试?还是通过wcf?还是通过阅读soa接口文档,在软件开发行业,总会有文档落后于代码的情况?这些手法都 ...
- Mac下修改环境变量并保存
1. 终端执行 touch ~/.bash_profile 2.终端执行 vim ~/.bash_profile 3.点一下向下箭头,点E 进入bash_profile文件 4.点i进入编辑模式,进行 ...