正则基础与细节回顾

行的开始和结束


  • 元素组成部分:metacharacters & literal (元字符和普通字符)。
  • ^: 一行的开头。
  • $: 一行的结束。
  • ^cat$:行开头, 然后匹配cat, 行结尾(没有多余的单词、空白字符 )。
  • ^$:空行(没有任何字符,包括空白字符)。
  • ^:行开头。

字符组


  • [···]:中括号内部列出期望匹配的字符。
  • [123456]:匹配1到6,里面匹配是或的意思。
  • [1-6]:同样匹配1-6,其中的-是字符组元字符(在字符组内部-->字符组元字符)。

注意:只在字符组内部且不是第一个元素,连字符才是元字符,否则它就只能普通的连字符号。

排除型字符组


  • [^123]取代[123],代表除了123以外的其他元素,其中的^代表排除的意思。
  • q[^u]是匹配字母q后不是u的情况,但是我们要考虑到一些问题,就是q可能是大写的Q,所以建议我们直接用[Qq][^u]。还有就是q正好位于行尾,紧跟着的会是换行符,如果正则没有保留换行符,那么q之后就没有元素,同样匹配不到(一个字符组,就算是排除型字符组,也需要匹配一个字符)。
  • [^x]:匹配一个不是x的字符,而不是说,只有当这个位置不是x时才能匹配(刚刚说的正好在行尾的情况)。

注意:这里的表示排除之意,与之前在字符组外部表示行锚点的不同,这里的^是一个元字符(在字符组内部且紧跟首个方括号之后)。

点符号匹配任意字符


  • .:匹配任意字符
    比如03/19/76,03-19-76,03.19.76,要匹配这些,我们不嫌麻烦可以这样 03[-./]19[-./]76,其实可以简单这样匹配 03.19.76。但是这样还会出现问题,他甚至会匹配到03319 76,这一点上显然没有前者精确,这就需要我们在检索精确度和文档了解度之前权衡。其实可以通过转义字符把元字符转化为普通的字符,从而更精确的匹配,后文会讲到。

注意:点符号并不是元字符,因为它在字符组内部。在字符组里面和外面,元字符的定义和意义是不一样的,这里的-同样不是连字符,因为它虽然位于字符组内,但是是在首个元素位置。

如果这样写[.-/],那就代表元字符了,用来表示范围,但是这样写明显是错误的用法。

多选结构


  • |:元字符,或的意思。依靠该字符可以把任意的正则表达式组合成一个总的表达式,并且总表达式可以匹配其中的任意子表达式。
    例如gr[ea]y可以写作grey|graygr(e|a)y,其中括号用来划定多选结构的范围(正常情况下,括号也是元字符 )。

注意:gr[e|a]y不符合我们的要求,因为在这里|只是一个普通字符。

在这里,gr[ea]ygr(e|a)y表示的意思一样,不要认为多选结构和字符组一样,一个字符组只能匹配目标文本中的单个字符,但是多选结构自身都可以是完整的正则表达式,都可以匹配任意长度的文本。

还有一点需要注意,就是多选结构和^$一起使用的时候。

  • ^From|Subject|Data:*:匹配的是^FromSubjectData:*
  • ^(From|Subject|Data):*:匹配一行的起始位置,然后是FromSubjectData任意一个,最后匹配:*

忽略大小写


egrep命令中加入-i参数即可,比如我们不对From区分大小写,那总不能这样写[Ff][Rr][Oo][Mm],这样显然繁琐,只需要忽略大小写即可。

单词分界符


  • \<\>:单词分界符,匹配单词分界的位置。由于单个<>并不是元字符,因此类似这种称为metasequences(元字符序列)。
    下图所示,单词开头位置用向上的箭头标识,单词结束的位置用向下的箭头标识。
    单词的起始和结束位置

小结


我们总结一下到目前为止学到的元字符

元字符 名称 匹配对象
. 逗号 单个任意字符
[···] 字符组 列出的任意字符
[^···] 排除型字符组 未列出的任意字符
^ 脱字符 行的起始位置
$ 美元符 行的结束位置
< 反斜杠-小于 单词的起始位置(某些版本的egrep可能不支持)
\> 反斜杠-大于 单词的结束位置(某些版本的egrep可能不支持)
| 竖线 匹配分隔两边的任意一个表达式
(···) 括号 限制竖线的作用范围,其他功能下文论述

可选元素


  • x?:代表x元素可有可无,不会匹配失败。
  • colou?r:匹配color或则colour。
    假如匹配英语中的7月4日(July fourth),7可以是July,也可以简写为Jul,4可以是fourth、4th和4。我们可以使用(July;Jul) (fourth;4th;4)也可以使用July? (fourth|4(th)?)

其他量词:重复出现


  • +:之前紧邻的元素出现一次或多次,如果连一次都没有匹配成功,就匹配失败。
  • *:前紧邻的元素出现任意多次或不出现,和一样,不会匹配失败。
    ?+*这些统称为量词,因为他们限定了所作用元素的匹配次数。

表示重复的元字符总结

-- 次数下限 次数上限 含义
1 可以不出现,也可以只出现一次(单次可选)
* 可以出现无数次,也可以不出现(任意次数均可)
+ 1 可以可以出现无数次,但至少要出现一次(至少一次)

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

  • ···{min,max}:区间量词。问号对应的区间量词是{0,1}
  • [a-zA-z]{1,5}:匹配美国的股票代码(1到5个字母)。
    当然并不是所有的egrep都支持。

括号及反向引用


到目前为止,我们见识过括号的两种用途:限制多项式的范围;将如干个字符组合为一个单元,受问号和星号之类量词的作用。现在介绍另外一种用途,反向引用。比如我们匹配重复的单词,使用the the,这样可能还是会匹配到the theory这种,其实使用\<the the\>倒是可以解决这个问题。但是重复单词就不止这一个,穷举显示不现实。于是我们想着匹配所有重复单词,首先匹配一个单词,让后面匹配的单词和先前匹配同样的单词即可。

  • \<([A-Za-z]+) +\1\>:匹配重复单词(记得加上-i参数忽略大小写),其中第一个单词使用括号括起来,再跟上一个特殊的元字符序列\1

当然,在一个表达式中我们可以使用多个括号。\1\2\3等来表示第一、第二、第三组括号匹配的文本。括号是按照开括号(从左至右的出现顺序进行的,所以([a-z])([0-9])\1\2中的\1代表[a-z]匹配的内容,而\2代表[0-9]匹配的内容。

另外,该表达式虽然很有用,但是,我们要知道它的局限性,重复的单词第一个位于某行末尾,第二个在下一行的开头,这个表达式就无法找到。

转义


  • ega\.att\.com:匹配ega.att.com,把本来是元字符的.转化为普通字符。
  • \([a-zA-Z]+\):用来匹配一个括号内的单词。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353