元素组成部分:metacharacters & literal (元字符和普通字符)。
1.1 ^
: 一行的开头。
1.2 &
: 一行的结束。
1.3 ^cat&
:行开头, 而后匹配cat, 行结尾(没有多余的单词、空白字符 )。
1.4 ^&
:空行(没有任何字符,包括空白字符)。
1.5 ^
:行开头。正则表达式
2.1 [···]
:中括号内部列出指望匹配的字符。
2.2 [123456]
:匹配1到6,里面匹配是或的意思。
2.3 [1-6]
:一样匹配1-6,其中的-
是字符组元字符(在字符组内部-->字符组元字符)。code
注意:只在字符组内部且不是第一个元素,连字符才是元字符,不然它就只能普通的连字符号。对象
3.1 用[^123]
取代[123]
,表明除了123之外的其余元素,其中的^
表明排除的意思。
3.2 q[^u]
是匹配字母q后不是u的状况,可是咱们要考虑到一些问题,就是q多是大写的Q,因此建议咱们直接用[Qq][^u]
。还有就是q正好位于行尾,紧跟着的会是换行符,若是正则没有保留换行符,那么q以后就没有元素,一样匹配不到(一个字符组,就算是排除型字符组,也须要匹配一个字符)。
3.3 [^x]
:匹配一个不是x的字符,而不是说,只有当这个位置不是x时才能匹配(刚刚说的正好在行尾的状况)。blog
注意:这里的^表示排除之意,与以前在字符组外部表示行锚点的^不一样,这里的^是一个元字符(在字符组内部且紧跟首个方括号以后)。文档
4.1 .
:匹配任意字符
好比03/19/76,03-19-76,03.19.76,要匹配这些,咱们不嫌麻烦能够这样 03[-./]19[-./]76
,其实能够简单这样匹配 03.19.76
。可是这样还会出现问题,他甚至会匹配到03319 76
,这一点上显然没有前者精确,这就须要咱们在检索精确度和文档了解度以前权衡。其实能够经过转义字符把元字符转化为普通的字符,从而更精确的匹配,后文会讲到。it
注意:点符号并非元字符,由于它在字符组内部。在字符组里面和外面,元字符的定义和意义是不同的,这里的-
一样不是连字符,由于它虽然位于字符组内,可是是在首个元素位置。table
若是这样写[.-/]
,那就表明元字符了,用来表示范围,可是这样写明显是错误的用法。class
5.1 |
:元字符,或的意思。依靠该字符能够把任意的正则表达式组合成一个总的表达式,而且总表达式能够匹配其中的任意子表达式。
例如gr[ea]y
能够写做grey|gray
或gr(e|a)y
,其中括号用来划定多选结构的范围(正常状况下,括号也是元字符 )。meta
注意:gr[e|a]y
不符合咱们的要求,由于在这里|
只是一个普通字符。引用
在这里,gr[ea]y
和gr(e|a)y
表示的意思同样,不要认为多选结构和字符组同样,一个字符组只能匹配目标文本中的单个字符,可是多选结构自身均可以是完整的正则表达式,均可以匹配任意长度的文本。
还有一点须要注意,就是多选结构和^
和$
一块儿使用的时候。
5.2 ^From|Subject|Data:*
:匹配的是^From
,Subject
,Data:*
。
5.3 ^(From|Subject|Data):*
:匹配一行的起始位置,而后是From
,Subject
,Data
任意一个,最后匹配:*
。
6.1 egrep命令中加入-i
参数便可,好比咱们不对From区分大小写,那总不能这样写[Ff][Rr][Oo][Mm]
,这样显然繁琐,只须要忽略大小写便可。
7.1 \<
和\>
:单词分界符,匹配单词分界的位置。因为单个<
和>
并非元字符,所以相似这种称为metasequences(元字符序列)。
下图所示,单词开头位置用向上的箭头标识,单词结束的位置用向下的箭头标识。
咱们总结一下到目前为止学到的元字符
元字符 | 名称 | 匹配对象 |
---|---|---|
. | 逗号 | 单个任意字符 |
[···] | 字符组 | 列出的任意字符 |
[^···] | 排除型字符组 | 未列出的任意字符 |
^ | 脱字符 | 行的起始位置 |
$ | 美圆符 | 行的结束位置 |
< | 反斜杠-小于 | 单词的起始位置(某些版本的egrep可能不支持) |
\> | 反斜杠-大于 | 单词的结束位置(某些版本的egrep可能不支持) |
| | 竖线 | 匹配分隔两边的任意一个表达式 |
(···) | 括号 | 限制竖线的做用范围,其余功能下文论述 |
9.1 x?
:表明x元素无关紧要,不会匹配失败。
9.2 colou?r
:匹配color或则colour。
假如匹配英语中的7月4日(July fourth),7能够是July,也能够简写为Jul,4能够是fourth、4th和4。咱们可使用(July;Jul) (fourth;4th;4)
也可使用July? (fourth|4(th)?)
10.1 +
:以前紧邻的元素出现一次或屡次,若是连一次都没有匹配成功,就匹配失败。
10.2 *
:前紧邻的元素出现任意屡次或不出现,和?
同样,不会匹配失败。
像?
、+
、*
这些统称为量词,由于他们限定了所做用元素的匹配次数。
表示重复的元字符总结
···· | 次数下限 | 次数上限 | 含义 |
---|---|---|---|
? | 无 | 1 | 能够不出现,也能够只出现一次(单词可选) |
* | 无 | 无 | 能够出现无数次,也能够不出现(任意次数都可) |
+ | 1 | 无 | 能够能够出现无数次,但至少要出现一次(至少一次) |
规定重现次数的范围:区间
10.3 ···{min,max}
:区间量词。问号对应的区间量词是{0,1}
。
10.4 [a-zA-z]{1,5}
:匹配美国的股票代码(1到5个字母)。
固然并非全部的egrep都支持。
到目前为止,咱们见识过括号的两种用途:限制多项式的范围;将如干个字符组合为一个单元,受问号和星号之类量词的做用。如今介绍另一种用途,反向引用。好比咱们匹配重复的单词,使用the the
,这样可能仍是会匹配到the theory
这种,其实使用\<the the\>
却是能够解决这个问题。可是重复单词就不止这一个,穷举显示不现实。因而咱们想着匹配全部重复单词,首先匹配一个单词,让后面匹配的单词和先前匹配一样的单词便可。
11.1 \<([A-Za-z]+) +\1\>
:匹配重复单词(记得加上-i参数忽略大小写),其中第一个单词使用括号括起来,再跟上一个特殊的元字符序列\1
。
固然,在一个表达式中咱们可使用多个括号。\1
、\2
、\3
等来表示第1、第2、第三组括号匹配的文本。括号是按照开括号(
从左至右的出现顺序进行的,因此([a-z])([0-9])\1\2
中的\1
表明[a-z]
匹配的内容,而\2
表明[0-9]
匹配的内容。
另外,该表达式虽然颇有用,可是,咱们要知道它的局限性,重复的单词第一个位于某行末尾,第二个在下一行的开头,这个表达式就没法找到。
12.1 ega\.att\.com
:匹配ega.att.com
,把原本是元字符的.
转化为普通字符。
12.2 \([a-zA-Z]+\)
:用来匹配一个括号内的单词。