(一)正则表达式是什么
所谓的正则表达式就是一个描述某些字符串匹配规则的工具,使用其中的元字符可以更好的去匹配想要得到的字符。以便更好的对字符串的处理。
(二)正则表达式能干什么
主要目的就是匹配文本。但是对于正则表达式的使用需要配合一些根据使用来增强处理文本的功能,例如:grep,sed,awk,more,less,vi等。
(三)正则表达式的原理
正则表达式是文本过滤的工具,通过元字符配合其他的字符来表达出一种规则,只有符合该规则的文本才能保留下来。如下图所示:
(四)正则表达式的使用
(1)基本正则表达式
基本正则表达式是标准的正则表达式,是最早定制的正则表达式,仅支持最基本的字符集,是POSIX规范定制的两种正则表达式语法之一,另一个就是扩展正则表达式。
(2)元字符
- ^ 行首定位符
- 例如: ls | grep “^aa” 匹配文件名开头为aa的文件 。
- $ 行尾定位符
- 例如:ls | grep “aa$” 匹配文件名后面两个字符为aa的文件名。
- . 单个字符匹配
- 例如:ps | grep “roo.” 匹配roo后面随意一个字符的进程。
- * 限定个数限定符
- 例如:ps | grep “ab*” 匹配含有a且a的后面有n个b的进程。
- [] 字符集匹配
- 例如:ls | grep “^abc[0-9]” 匹配文件名以ab开头且第四个字符是数字的文件名。
- [^] 字符集不匹配
- 例如: ls | grep “^abc[^0-9]”匹配文件名以ab开头且第四个字符不是数字的文件名。
注意:
- ^ 表示空字符,cat 表示字符cat
- *或.位于[] 后依然可以当做元字符,不会变成普通字符,亲测。
- *或.位于[] 中依然可以当做元字符,不会变成普通字符,亲测。
- {m,n} 由于*只能匹配任意的,不能确切的匹配到固定的个数,此时该元字符就发挥到作用了。
- 例如:egrep “[^adc[:digit:]{1,3}”
- {n}前置字符出现n次。
- {m,}前置字符最少出现m次。
- 例如:egrep “[800-[:digit:]{3}-[[:digit:]]{4}$” filename
(3)扩展正则表达式
扩展正则表达式支持比基本正则表达式更多的元字符,但是扩展正则表达式的元字符基本正则表达式并不支持,其新增的元字符为:
- + 与* 基本相同,就是+前面的字符至少出现1次
- ? 与+相对,最多出现一次
- | 与 () 表示多个正则表达式之间或的关系
- 语法为:exp1 | exp2 |exp3|…|通常与(配合使用(exp1 | exp2 |exp3|…|)
- 例如:ls /etc | egrep “(ssh|ssl|^yum)列出含有字符串ssh或ssl或者以yum开头的文件。
注意:当使用扩展的正则表达式时,需要使用egrep执行,grep不支持哦。
(3)正则表达式字符集
- [:alnum:]:匹配人以字母或数字
- [:alpha:]: 匹配任意一个字母
- [:digit:]: 匹配任意一个数字
- [:lower:]: 匹配任意一个小写字母
- [:upper:]: 匹配任意一个大写字母
- [:space:]: 匹配任意一个空白字符,包括空格,制表符,换行符,以及分页符。
- [:blank:]: 匹配空格或制表符
注意:在使用时需要再一次加上[],如:[[:digit:]]
(4)子正则表达式,有时需要某个字符串出现n次,这时候就需要字表达式了,只要加上()就OK.
例如test.txt文本:
jingtikai sjhi
sd dsfsdf
jingjing isdjid
hahahah
我想要得到”jing”或”ha”出现两次的行,这时候就需要使用cat test.txt | egrep “(jing|ha){2}”就OK。