目录

1、什么是正则表达式?

2、正则表达式的定义

3、简单的字符串格式描述

4、使用正则表达式来描述字符串

5、正则表达式的字符定义

6、正则表达式的长度定义

7、正则表达式的位置定义

8、正则表达式的分组定义

9、正则表达式中的修饰

10、正则表达式中使用递归


1、什么是正则表达式?

正则表达式是对字符串的一种描述方法,即,使用特定的信息来描述字符串格式的一种方式。

2、正则表达式的定义

正则表达式的应用范围非常广泛,对于开发人员来说,主要应用于后台程序和js代码之中。
对于.net、asp、php、js等环境的正则,它们的正则是PCRE流派,而部分文本编辑器也有对正则的支持,但是不符合PCRE流派,而是POSIX规范下的其他流派。
本培训中,我们主要针对PCRE流派进行讲解。

3、简单的字符串格式描述

在我们接触正则表达式之前,我们对字符串的格式判断存在着根本性的困难。
比如,我们想判断我们的字符串是否是一个手机号码,我们需要先判断这个字符串是否是一个合法的整数数字,然后判断这个字符串的长度是否是11位的,最后判断第一个字符是否是数字1。
又比如,我们想判断某个字符串是否存在html标签,则首先需要使用split或者instr等方法判断、切割字符串是否包含标签定义符号<和>,然后判断<之后是否是英文字符串,并且字符串之后必须是一个空格或者>结束符号。
通过这些,我们发现对字符串格式的描述成为了一个必须要有特殊规范的事物,于是正则产生了

4、使用正则表达式来描述字符串

在正则中(本培训使用的正则为PCRE流派,之后不再声明),提供了一些基础的定义,来帮助我们解决字符串描述的问题。
同样尝试描述一个手机号码,我们使用正则的写法如下:^1\d{10}$
其中\d代表了0到9的数字,{10}的意义是长度为10个字符,^在这里的意义表示字符串开始,$的意义表示字符串结束,那么这个正则的描述意义就是这样的:由数字1开始,后边跟上10个任意数字后结束。
我们再来尝试描述一下html标签的定义:<[a-z]+(?!\w)[^<>]*?>
这个定义的意义如下:由<开始,且<之后必须是多个字母的,字母之后不能跟随数字、下划线,然后跟任意多个非<和>的字符,最后由>结束。
由此,我们可以发现,使用正则来描述字符串格式是一个非常简化的方法

5、正则表达式的字符定义

对于正则表达式,可以参考http://blog.csdn.net/superwfei/article/details/1299107,这个就是老顾学习正则入门的内容
1:普通字符,abc就是一个简单的正则表达式,它的意义就是在字符串中比对,看看是否出现了abc这三个字母且连续的,例如 abdc 是不符合这个正则定义的,而 babcd 是符合的
2:简单的转义,由于在正则表达式中,需要有一些特殊符号进行正则描述,那么,在我们想使用这些符号的时候,就需要进行转义后才能正常定义,例如()*+.{}[]^$|?\等,转义符号就是\,那么转义后的正则就是\(\)\*\+\.\{\}\[\]\^\$\|\?\\
3:字符集合,[a-z],这个正则的意义就是由字母a到z共26个字母中任意一个字母,其中[]表示的是字符集合,在[]内则是字符枚举,在枚举中支持由ascii码小的到ascii码大的区间定义,使用-连接
4:其他转义字符,在正则中,我们还可以使用16进制来描述字符,\x20这个正则就是描述空格的\x63这个正则就是描述小写字母c的,同样\u814b就可以匹配unicode汉字“並”
5:使用多种方式定义字符集合,[a-z0-9\u4E00-\u9FFF-],这个定义的意义就是汉字、字母、数字或者减号中的任意符号,需要注意的是减号后边没有其他符号的集合定义才是减号本身的定义
6:正则中预定义的集合
6.1:\w等同于[a-zA-Z0-9_],即字母数字下划线集合
6.2:\d等同于[0-9],即数字集合
6.3:\r为回车符,\n为换行符,\t为制表符,\s 为除回车和换行之外的其他空格类型的字符
6.4:.为除了\n(换行)之外的其他任意字符
7:使用补集,在正则中,我们通常会遇到需要描述为非某类字符,如果遇到非连续的定义,则使用集合定义则非常麻烦,所以正则提供了一个补集方法[^abcxyz],这个正则的意义就是除了字母abcxyz之外的其他所有字符
  在这里需要注意 ^ 符号,只有出现在[]内,且在[]内第一个位置的 ^ 符号才是定义补集

6、正则表达式的长度定义

在正则表达式中,提供了多种长度的定义方式,且长度定义分为贪婪与非贪婪模式,我们首先学习长度定义,然后区分匹配模式
1: [a-z]{2,4},这个正则的意义是由字母组成,最少需要出现两个连续的字母,最大出现4个,例如 abc 是符合的,3b2d是不符合的,需要注意 abcdefg 同样是符合的,因为这个字符串中某个片段是符合正则定义的

正则表达式中,{}为长度的描述,格式为{m,n},其中m为最小长度,n为最大长度,当m省略是,m的默认值为0,当n省略时,则n的默认值为不限,如果只有一个数字,且没有逗号时,等同于m和n的值相同

2: [a-z]+,这个正则的意义是由字母组成,最少有一个字母,最大不限,只要是连续字母即可,例如 abc 是符合的,3b2d 也是符合的,3-4-5 这不符合定义,因为它没有出现字母,这个正则等同于 [a-z]{1,}
3: [a-z]*,这个正则的意义是由字母组成,最大及最小都不限,只要是连续字母即可,例如 abc 是符合的,3b2d 也是符合的,3-4-5 同样符合定义,这个正则等同于 [a-z]{0,}
4: [a-z]?,这个正则的意义是由字母组成,最少是0个,最多是1个,例如 abc 是符合的,3b2d 也是符合的,3-4-5 同样符合定义,这个正则等同于 [a-z]{0,1}
5:区分贪婪与非贪婪,例如在字符串 abcdefghijklmnabcdefghijklmn 中,我们要获取到以字母a开始,以字母n结束的内容
  可以用正则描述为 a[a-z]*n,这个模式我们称之为贪婪模式,得到的结果是“abcdefghijklmnabcdefghijklmn”
  如果在长度描述后追加一个?号, a[a-z]*?n,这个模式我们称之为非贪婪模式,得到的结果是“abcdefghijklmn”

7、正则表达式的位置定义

在正则进行格式描述的时候,有的时候我们需要更加精确的描述,类似必须以特定信息开始、结束之类的,于是正则提供了一下集中位置声明
1:^,这个正则的意义是字符串开始位置,如果是多行匹配模式,则表示本行字符串开始
2:$,这个正则的意义是字符串结束位置,如果是多行匹配模式,则表示本行字符串结束
3:\b,这个正则的意义是单词边界符,例如 “abc def”,这个字符串中存在四个\b,扩展开来的形式是“^\babc\b \bdef\b$”
根据上述定义,我们可以在字符串中查找所有以字母a开头的单词,正则定义如下:\ba[a-z]*

8、正则表达式的分组定义

在正则表达式中,除了字符集合定义外,有时候还需要特定的词组来进行判断,例如查找 abc 开头的单词,或者xyz开头的单词,使用[ax][by][cz]显然是错误的,因为ayz同样符合这个正则
所以,在正则表达式中,提供了分组定义()和或运算符|,那么,上述格式的正则就可以写作(abc|xyz)[a-z]*
同时,在正则中,可以引用之前定义的分组,例如查找一个以字母a或者e开头的,并以同样字母结束的单词,正则可以写作([ae])[a-z]*\1,在这个正则中,\1就表示引用第一个分组
引用分组的位置,和定义分组的内容是完全一致的,同样,分组也可以多次引用,分组定义则以(的开始位置进行排序,例如([ae])([a-z]*)\1\2,这个正则就可以描述 aoeaoe,eheh 之类的字符串
然后,在大部分环境中,如果不想让某个()参与分组运算,则可以在()内增加修饰?:,例如([ae])(?:[a-z]*|\d*)\1,在这个正则中,只有一个分组([ae]),而(?:[a-z]*|\d*)仅仅是或运算,不参与分组
最后,不管是否参与分组运算的分组,都可以使用长度来进行修饰,所以,一个经典的实例,电子邮件地址的验证正则如下:^[\w\.-]+@[\w-]+(\.[\w-]+)+$

9、正则表达式中的修饰

在正则中,通过上述列举的内容,我们已经可以匹配到我们预期的内容,甚至是超出预期的内容了,那么,为了更加严格的制定匹配规则,所以睁着表达式提供了多种修饰
修饰的格式:(?修饰运算符匹配表达式)
1:注释修饰符,(?#注释信息),为了提高正则的可读性,或者备忘,通常可以在正则内追加注释内容,注释内容完全不参与正则运算,在正则编译时,会自动去除注释修饰符及其中的注释内容
  例如^\d+$^\d+(?#这是一个匹配纯数字字符串的正则)$完全等效
2:断言修饰符,(?断言方式匹配表达式),在正则表达式中,除了匹配我们所要匹配的内容外,我们还会通过断言方式来增加一些条件
  例如,匹配一个电话,单独字符串的话是这样^1\d{10}$,这样就匹配出了以数字1开头的11位数字,但如果出现在一段文字中,那么^$就不能使用了
  例如文本“这是一个手机号码13800138000,这不是一个电话号码199912251600”,如果提取电话我们的写法是1\d{10},那么提取的结果会有两个,分别是13800138000和19991225160,很明显第二个结果不符合我们的预期
  断言修饰符一共有四种(?=匹配表达式)右侧匹配,(?!匹配表达式)右侧不匹配,(?<=匹配表达式)左侧匹配,(?<!匹配表达式)左侧不匹配
  那么,上述文本中,我们提取电话的正则可以写作(?<!\d)1\d{10}(?!\d),这个正则的意义就是数字1左侧不为数字,提取由数字1开头的11位数字,且11个数字之后不能跟随数字
  断言修饰符的作用与^、$、\b类似,可以作为一个位置定义使用
3:分组修饰,(?<分组名称>匹配表达式),前面已经讲述了分组,不管是否有分组名称,分组都会有一个序号,由左到右自动计数,而增加了分组名,则可以更好的理解分组意义,除了可以使用分组名进行引用外,其意义与注释相差不大
4:不分组修饰,(?:匹配表达式),顾名思义,追加了此修饰符的内容,不参与到分组运算中,但其中的匹配表达式正常进行正则运算,在这里需要注意一点,所有的修饰都不参与分组

10、正则表达式中使用递归

在部分语言环境中,正则是具有递归支持的,例如在 Java 中, [a-zA-Z]\w+\s+(?R)\d\w*
这个正则的意义是由字母开头,后边跟随至少一个字母数字下划线组成的字符串,然后是一个空白符,最后是一个数字开头的,后边跟随任意数量的字母数字下划线,且在数字开头这个定义之前,可以递归一个同样的定义
比如文本“ab cd ef 321”,对应上述正则的结果就是“ab (cd (ef 3)2)1”,其中括号表示的是递归内容
但是令人头疼的是.net并不支持递归,幸运的是,虽然.net不支持递归,但是.net支持层深计算,所以,我们可以通过层深来实现和递归差不多的定义,当然这有点麻烦
层深表达式: (匹配表达式(?<分组名>)|匹配表达式(?<-分组名>))*(?(分组名)(?!))
这里使用一个实例进行讲解: <(div)(?!\w)[^<>]*>(([^<>]|<(?!/?\1(?!\w))[^<>]*>)*|<\1(?!\w)[^<>]*>(?<DEPTH>)|</\1(?!\w)[^<>]*>(?<-DEPTH>))*(?(DEPTH)(?!))</\1(?!\w)[^<>]*>

 <(div)(?!\w)[^<>]*>(?#这里进行第一个分组,获取标签名)(([^<>]|<(?!/?\1(?!\w))[^<>]*>)*(?#任意数量的其他标签外内容及第一分组定义的标签名外的其他标签)|<\1(?!\w)[^<>]*>(?<DEPTH>)(?#遇到符合同样标签名的开始标签时,层深堆栈+1)|</\1(?!\w)[^<>]*>(?<-DEPTH>)(?#遇到符合同样标签名的结束标签时,层深堆栈-1))*(?(DEPTH)(?!))(?#判断堆栈中分组的数量,如果堆栈中还有内容则匹配失败)</\1(?!\w)[^<>]*>(?#以第一分组相同的标签名的标签结束标记)

文盲的正则表达式入门相关推荐

  1. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  2. 正则表达式入门之字符匹配

    正则表达式入门-字符匹配 在前段时间进行文本挖掘练习的时候,不会使用正则表达式,深感不宜.所以这里,我想赶紧学习一下正则表达式. 注:本文是对<正则表达式必知必会>的复习. 1.正则表达式 ...

  3. 绿色版的正则表达式测试工具及正则表达式入门教程

    下载网址:https://download.csdn.net/download/xyz846/10856604 RegexTester是一款正则表达式测试器,支持单行模式.多行模式,经典的窗口设计,该 ...

  4. 正则表达式入门-findall()函数

    正则表达式入门-findall()函数 findall()函数 例子 import re a = '123abc' re=re.findall('\d\d\d',a) print(re) 导入用于完成 ...

  5. 正则表达式发明者_【D1n910】正则表达式入门(三)

    正常操作,正常分析,大家好,我是D1n910. 最近又发生了一些很严重的事情,祥林嫂是可怜的,可是因为又祥林嫂的存在,让一些人可能不愿意向别人倾诉自己"悲惨"的经历了. 正则表达式 ...

  6. 【python学习】正则表达式入门

    python正则表达式入门学习 前言 今天进入python正则表达式的入门学习 学习正则表达式的初衷还是为了awd比赛做准备 (好吧,其实学习python都是为了ctf啊) 学习的目的就是为了可以提取 ...

  7. 文盲的Python入门日记:第六天,继续完善我们的MsSql类,支持查询结果的筛选和排序,以及日期类型

    文盲的Python入门日记:第一天,Python环境搭建 文盲的Python入门日记:第二天,连接到mssql和python代码书写初体验 文盲的Python入门日记:第三天,用一些小练习感受一下py ...

  8. 正则表达式入门与进阶

    文章目录 正则表达式入门部分 一.字符组 二.区间 三.特殊字符转义符 四.字符组取反 五.快捷方式 5.1 匹配单词字符.数字 5.2 匹配空白 5.3 匹配单词边界 5.4.快捷方式取反 5.5. ...

  9. Python 正则表达式入门(初级篇)

    唯心不易(转载) https://www.cnblogs.com/chuxiuhong/p/5885073.html Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门 ...

最新文章

  1. jupyter添加标题、文字注释
  2. lpi linux认证权威指南 pdf,LPI Linux认证指南读书笔记
  3. 对3维数组中间一维进行操示例
  4. STL常用的排序算法
  5. IT自动化:自动化的网络管理变得很重要
  6. 腾讯AI Lab的研究方向
  7. 高等数学下-赵立军-北京大学出版社-题解-练习10.2
  8. python complex函数def_【Python3】Python函数
  9. PyMC3和Lasagne构建神经网络(ANN)和卷积神经网络(CNN)
  10. 2016版系统集成项目管理工程师下午案例分析考试范围
  11. php ci框架中脚手架是做什么用的
  12. vue 中watch函数名_vue中watch的使用
  13. mysql 查询缓存及设置
  14. linux常用命令(入门)
  15. java 获取32位纯数字 或字母与数字结合的唯一id
  16. 多张eps合并成一张
  17. 关于 Could not find artifact ...:pom:1.0-SNAPSHOT 的问题!
  18. 仙境传说 第一章之四 卢渊*梦魇过后的情缘
  19. Sublime Text3 Mac版去掉自动更新和添加中文
  20. Zookeeper + Centos7 详细安装教程

热门文章

  1. 机器学习:K近邻算法(K-NN)
  2. SQL Server唯一约束
  3. 【Python算法】数值分析—列主元高斯消元法——附源码
  4. 大数据分类和架构简介
  5. 欢(nan)乐(shou)纪中培训(Day 2)
  6. 视频教程-沐风老师3DMAX编织建模视频课程-3Dmax
  7. php获取页面输出内容,PHP CURL获取页面内容输出例子
  8. oracle修改表名
  9. flink的事务之两阶段提交
  10. 痛心:实验室服务器被挖矿怎么办?