简介

本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及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中正则表达式的使用的更多相关文章

  1. 正则表达式概述与JAVA中正则表达式的应用

    编程或者电脑使用过程中,经常需要对字符串进行 匹配,查找,替换,判断.如果单纯用代码 if () ,whlie 什么的进行比较复杂麻烦.正则表达式是一种强大灵活的文本处理工具,专门对字符串进行匹配,查 ...

  2. (转)如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器

    原文地址:http://www.dranger.com/ffmpeg/ FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码. ...

  3. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  4. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  5. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  6. Java中正则表达式去除html标签

    Java中正则表达式去除html的标签,主要目的更精确的显示内容,比如前一段时间在做类似于博客中发布文章功能,当编辑器中输入内容后会将样式标签也传入后台并且保存数据库,但是在显示摘要的时候,比如显示正 ...

  7. java中正则表达式基本用法(转)

    https://www.cnblogs.com/xhj123/p/6032683.html 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符( ...

  8. JAVA中正则表达式学习总结

    一.JAVA中正则表达式相关的类 1. java.util.regex.Pattern 该类用于编译模式,模式可以理解为一个正则表达式,比如:a*b. 用法如下: // 创建模式 Pattern p ...

  9. JAVA中正则表达式常用的四个方法

    JAVA中正则表达式处理字符串的四个常用方法:匹配.分割.替换.截取.其跟字符串的常用函数相似,但是使用正则表达式会更简单.更加简洁.下面是具体的例子: public class TestRegex ...

随机推荐

  1. 交换机进行VLAN划分

    一个交换机连接两个虚拟局域网(vlan10和vlan20),通过设置交换机,实现同一虚拟局域网内部相互通信,不同虚拟局域网内不能相互通信 (vlan 将整个网络划分多个广播域,vlan主机不受地理位置 ...

  2. Python之函数知识

    Python函数分类 a,内置函数 b,自定义函数 c,导入函数 一个函数就相当于一个功能块,比如获取数据库,更新数据库,函数其实就是代码的分块,调用函数来执行代码块 一块就代表一个功能 内置函数有以 ...

  3. 谷歌IAP:skusBundle array associated with key ITEM_ID_LIST cannot contain more than 20 items.

    这几天在接谷歌的支付,在拉谷歌商品列表的时候转菊花,长时间不返回(querySkuDetails),一开始以为因为IAP有key不对导致的,查了下发现没有问题. 再看logcat,发现了这行: Inp ...

  4. 如何升级php版本---从php5.5.12 升级php7.1.5 wamp实践

    1.从官网下载一个php7.1.5 2.将刚下载的压缩包解压缩,修改命名为php7.1.5,即php+版本号. 3.将这个文件夹放在wamp/bin/php 目录下. 4.将原来版本的php5.5.1 ...

  5. Editplus配置java运行环境以及其他需求的简单设置

    java配置 首先,打开"工具"(tools)选项,选择"配置自定义工具组"(英文版 是倒数第二个)然后按照上面第二幅图片来配置javac环境,其中命令一栏是j ...

  6. JTable常见用法细则+设置某列可编辑+滚动表格

    JTable常见用法细则 JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一.创建表格控件的各种方式: 1)  调用无参构造函数. JTa ...

  7. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  8. Calendar使用

    1简单例子 package com.kungeek.tip; import java.text.SimpleDateFormat; import java.util.Calendar; import ...

  9. 006开源O/R映射框架内容回顾

    Hibernate是一个O/R映射框架(也称为ORM) 从ORM词来看,O---Object(对象模型):R--- Relational(关联模型),可以做对象和关联的一种映射,当然这只是部分功能,一 ...

  10. springboot 自定义Repository

    启用 JpaRepositories package cn.xiaojf; import cn.xiaojf.today.data.rdb.repository.RdbCommonRepository ...