2 可选项元素

2.1 ?

现在来看color和colour的匹配。它们的区别在于,后面的单词比前面的多一个u,我们可以用colou?r来解决这个问题。元字符?(也就是问号)代表可选项。把它加在一个字符的后面,就表示此处容许出现这个字符,也可以不出现这个字符,问号前面的字符并非匹配成功的必要条件。
这个元字符与我们之前看到的元字符都不相同,它只作用于之前紧邻的元素。因此,colou?r的意思是:c,然后是o,然后是l,然后是o,然后是u,最后是r。u?是必然能够匹配成功的,有时它会匹配一个u,其他时候则不匹配任何字符。关键在于,无论u是否出现,匹配都是成功的。但这并不等于,任何包含?的正则表达式都永远能四配成功。例如,colo和u?都能在“semicolon”中匹配成功(前者匹配单词中的colo,后者什么字符都没有匹配)。可是最后的r无法匹配,因此,最终colou?r无法匹配semicolon。
另一个例子,我们需要匹配表示7月4日(July fourth)的文本,其中月份可能写作July或是Jul,而日期可能写作fourth、4th或者是4.显然,我们可以使用“(July|Jul)(fourth|4th|4),但也可以用其他的办法来解决这个问题。
首先,我们把(July|Jul)缩短为“(July?)。删除|之后,就没必要保留括号了。于是我们得到July? (fourth|4th|4)。然后,可以把4th|4简化为4(th)?。我们看到,现在作用的元素是整个括号了。括号内的表达式可以任意复杂,但是“从括号外来看”它们是个整体。界定作用对象是括号的主要用途之一。我们的表达式现在成了July? (fourth|4(th)?)
通过上面两个例子,可以看到正则表达式不是死板的教条,它更像是门艺术。

2.2 其他量词:重复出现

+(加号)和*(星号)的作用与问号类似。元字符+表示“之前紧邻的元素出现一次或多次”,而*表示“之前紧邻的元素出现任意多次,或者不出现”。换种说法就是,*表示“匹配尽可能多的次数,如果实在无法匹配,也不要紧”。+的意思是“匹配尽可能多的次数,但如果连一次匹配都无法完成,就报告失败“。问号、加号和星号这3个元字符,统称为量词,因为它们限定了所作用元素的匹配次数。
...?一样,正则表达式中的...* 也是永远不会匹配失败的,区别只在于它们的匹配结果。而...+在无法进行任何一次匹配时,会报告匹配失败。

2.3 规定重现次数的范围:区间

使用元字符序列来自定义重现次数的区间:(min,max)。这称为“区间量词(intervalquantifier)”。例如,{3,12}能够容许的重现次数在3到12之间。有人可能会用[a-zA-Z](1,5)来匹配美国的股票代码(1到5个字母)。问号对应的区间量词是{0.1}。

2.4 括号及反向引用

前面已经见过括号的两种用途:限制多选项的范围;将若干字符组合为一个单元,受问号或星号之类量词的作用。现在介绍括号的另一种用途:括号能够移“记住”它们包含的子表达式匹配的文本。在解决单词重复问题时会用到这个功能。
查找重复单词,比如在一行中有连续的“the the”两个重复的单词,我们先匹配第一个单词,接下来检查“后面的单词是否与它一样”。如果你的egrep支持“反向引用(backreference)”,就可以这么做。反向引用是正则表达式的特性之一,它容许我们匹配与表达式先前部分匹配的同样的文本。
我们先把’the the“中的第一个the替换为能够匹配任意单词的正则表达式[A-Za-z]+;然后在两端加上括号,最后把后一个‘the’替换为特殊的元字符序列1,就得到了\<([A-Za-z]+) +\1\>% egrep -i '\<([a-z]+) +\1\>' files...这样就可以查找连续重复的单词。
在支持反向引用的工具软件中,括号能够“记忆”其中的子表达式匹配的文本,不论这些文本是什么,元字符序列\1都能记住它们。而且,在一个表达式中我们可以使用多个括号。再用\1、\2、\3,等来表示第一、第二、第三组括号匹配的文本。所以([A-Z])([0-9])\1\2中的\1代表[a-z]匹配的内容,而\2代表[0-9]匹配的内容。
注意:它的局限性。因为egrep把每行文字都当作一个独立部分来看待,所以如果重复单词的第一个单词在某行末尾,第二个单词在下一行的开头,这个表达式就无法找到。

2.5 转义

如果需要匹配的某个字符本身就是元字符,正则表达式会如何处理呢?例如,如果想要检索互联网的主机名ega.att.com,使用ega.att.com可能得不到正确的结果。因为.本身就是元字符,它可以匹配任何字符,包括空格。
所以,真正匹配文本中点号的元序列应该是反斜线加上点号的组合:ega\.att\.com。称为“转义的点号”,这样的办法适用于所有的元字符,不过在字符组内部无效。
还可以用\([a-zA-Z] +\)来匹配一个括号内的单词,例如(very)在开闭括号之前的反斜线消除了开闭括号的特殊意义,于是他们能够匹配文本中的开闭括号。

2.6 正则表达式的目标

一个正则表达式要么能够匹配给定文本中的某些字符,要么不能匹配。在编写正则表达式的时候,必须进行权衡:匹配符合要求的文本,同时忽略不符合要求的文本。在任何语言中,经验都是非常重要的。

2.7 变量名

程序语言标识符(变量名)只包含字母、数字以及下画线,但不能以数字开头。我们可以用[a-zA-Z_][a-zA-Z_0-9]*,来匹配。第一个字符组匹配可能出现的第一个字符,第二个(包括对应的星号)匹配余下的字符。如果标识符的长度有限制,例如最长只能是32个字符,就加入区间量词{min, max},我们可以用{0,31}来替代最后的*

2.8 引号内的字符串

匹配引号内的字符串最简单的办法是使用这个表达式"[^"]*"
两端的引号用来匹配字符串开头和结尾的引号。在这两个引号之间的文本可以包括双引号之外的任何字符。所以我们用[^"]来匹配除双引号之外的任何字符,用*来表示两个引号之间可以存在任意数目的非双引号字符。
关于引号字符串,更有用(也更复杂)的定义是,两端的双引号之间可以出现由反斜线转义的双引号,例如"nail the 2\"x4\" plank"

2.9 表示时刻的文字,例如!“9:17am”或者“12:30pm

匹配表示时刻的文字可能有不同的严格程度。

[O-9]?[0-9]:[0-9][0-9] (am|pm)

上面语句能够匹配9:17 am或者12:30 pm,但也能匹配无意义的时刻,如99:99 pm。

首先看小时数,如果小时数是一个两位数,第一位只能是1,但是1?[0-9],仍然能够匹配19(也能够匹配0),所以更好的办法应该是把小时部分分为两种情况来处理,1[012],匹配两位数,[1-9]匹配一位数,结果就是(1[012]|[1-9])
分钟数第一位数字应该是[0-5],此时第二位数字应该是[0-9]。综合起来就是(1[012]|[1-9]):[0-5][0-9] (am|pm)

2.10 总结

第一,第二节笔记学习了以下内容:

几点注意事项:
1、各个egrep程序是有差别的。它们支持的元字符,以及这些元字符的确切含义,通常都有差别—要参考相应的文档。
2、使用括号的3个理由是:限制多选结构、分组和捕获文本。
3、字符组的特殊性在于,关于元字符的规定是完全独立于正则表达式语言“主体”的。
4、多选结构和字符组是截然不同的,它们的功能完全不同,只是在有限的情况下,它们的表现相同。
5、排除型字符组同样是一种“肯定断言”一即使它的名字里包含了“排除”两个字,它仍然需要匹配一个字符。只是因为列出的字符都会被排除,所以最终匹配的字符肯定不在列出的字符之内。
6、-i参数很有用,它能进行忽略大小写的匹配。
7、转义有3种情况:
\加上元字符,表示匹配元字符所使用的普通字符(例如*匹配普通的星号)。
\加上非元字符,组成一种新的有其规定意义的元字符序列(例如,\<表示“单词的起始边界”)。
\加上任意其他字符,默认情况就是匹配此字符(也就是说,反斜线被忽略了)。
对大多数版本的egrep来说,字符组内部的反斜线没有任何特殊意义,所以此时它并不是一个转义字符。
8、由星号和问号限定的对象在“匹配成功”时可能并没有匹配任何字符。即使什么字符都不能匹配到,它们仍然会报告“匹配成功”。

精通正则表达式笔记二---正则表达式基础概念?,+,*,{ },\,“ “,时间,小结相关推荐

  1. 机器学习入门 笔记(二) 机器学习基础概念

    第二章 机器学习基础概念 1.机器的数据 2.机器学习的主要任务 3.监督学习和非监督学习 4.批量.在线学习.参数.非参数学习 5.哲学思考 6.环境的搭建 1.机器的数据 我们以鸢尾花的数据为例. ...

  2. 区块链教程(二):基础概念介绍

    注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 本系列重点在于以太坊基础知识.以太坊客户端以及以太坊solidity编程,因此博客重点在于以太坊核心知识点的掌握,区块链部分的基础知识可以作为补充 ...

  3. es match 查询时间段_elasticsearch 笔记二 之基础查询

    这一篇笔记介绍几种 es 的基础查询,非聚合查询. 目录如下: 数据导入 排序查询 es 中的 limit 和offset 匹配字符串 匹配词组 数字精确查找 es 中的或与非 es 中的大小于过滤 ...

  4. GIS地图学习笔记一之基础概念

    要做GIS地图的开发,我们需要先了解GIS地图相关的概念. 相关概念可以在这里了解-->ArcGIS 帮助库 本文是从上述网站中学习,摘抄的. 基础概念 地理信息系统 (GIS) 是以可视化和分 ...

  5. [云炬python3玩转机器学习笔记] 2-1机器学习基础概念

    机器学习基础概念 一.关于数据 本文约定: 大写表示矩阵 小写表示向量 上标代表第几个样本 下标代表第几个特征 一般向量都表示为列向量 特征空间:每个维度都可以表示一个特征,形成一个空间(2D,3D, ...

  6. shell编程入门步步高(二、基础概念)

    基础概念部分 登陆主机 登陆主机分为本地登陆和远程登陆. 本地登陆:就是直接面对主机,由键盘输入用户密码登陆,使用tty1-tty6,或者图形界面tty7 远程登陆:通过网络连接主机,以虚拟终端的方式 ...

  7. Python笔记002-Python编程基础概念

    第二章(1):Python编程基础概念 1. Python 程序的构成 Python 程序有模块组成.一个模块对应 Python 源文件,一般后缀名是:.py. 模块有语句组成.运行 Python程序 ...

  8. 精通正则表达式笔记一---正则表达式基础概念[ ],[^ ],.,^,$,\<,\>,|,(),-

    学习过程中,可以到这篇文章推荐的网站进行正则表达式的练习.点击这里 正则表达式是一种思想--各种工具以各种方式来实现它.如果理解了正则表达式的基本思想,掌握就是易如反掌的事情. 弄明白"如何 ...

  9. 【LVGL学习笔记】(二) 基础概念

    LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库.并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发. LVG ...

最新文章

  1. Tengine怎么去安装第三方模块、以及安装源码中的模块
  2. boost::hana::is_valid用法的测试程序
  3. C++之invalid initialization of non-const reference of type ‘int’ from an rvalue of type ‘int’
  4. 如何检查python的库是否安装成功_机器学习之Python编程库的安装
  5. python makefile
  6. 【渝粤教育】电大中专计算机使用基础_1作业 题库
  7. Java-集合练习题
  8. SpringBoot文件上传文件大小限制The field file exceeds its maximum permitted size of 1048576 bytes.
  9. 信息安全-安全专业名称|CVE|RCE|POC|VUL|0DAY
  10. 内网访问高德地图nginx代理
  11. 你玩的英雄在比赛中发挥如何呢?
  12. Cocos2d-x的学习之旅(七)更新函数Update
  13. 2013驾考科目一理论知识重点归纳
  14. vue-element-admin 快捷标签导航(三)
  15. 升级Mac Catalina后OBS录屏软件麦克风和内置声音输出没有声音的问题
  16. 2020幂次生长,GMIC开启下一个10年科技新浪潮
  17. 视频导入pr一卡一卡的(解决)
  18. DrawingManager.js___百度地图API
  19. Python 办公自动化,全网最全整理来了!拒绝无效率加班!
  20. MySQL常用系统名字

热门文章

  1. 什么样的 GitHub 才适合放简历上?
  2. Samsung Curved UHD TV 4K超高画质、4200R黄金曲面萤幕,层峰人士聪明选择 ...
  3. 如何用快捷键关闭计算机,电脑如何快捷键关机
  4. OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
  5. ubuntu 12.04 给四个工作区设置不同壁纸
  6. MySQL 玄学问题总结
  7. 【Try to Hack】fiddler
  8. 学生成绩管理系统c语言堆排序快速排序,c语言 快速排序---归并排序----堆排序...
  9. ArcGIS 基于TIN地表面数据和建筑数据进行视域分析
  10. 一篇文章教会你无货源店铺玩法