文章目录
前言
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
例如:
• runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前⾯面的字符必须⾄至少出现⼀一次(1次或多次)。
• runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
• colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。
例如:搜索有the的行,并输出行号
$ grep -n 'the' regular_express.txt
搜索没有the的行,并输出行号
$ grep -nv 'the' regular_express.txt
[]的介绍
利⽤[]搜索集合字符,[] 表示其中的某⼀个字符
例:[ade] 表示a或d或e
$ grep -n 't[ae]st' regular_express.txt
输出结果:
8:I can’t finish the test.
9:Oh! the soup taste good!
用^符号做[]内的前缀,表示除[]内的字符之外的字符。
例:
比如搜索oo前没有g的字符串所在的行. 使⽤用 ‘[^g]oo’ 作搜索字符串
$ grep -n '[^g]oo' regular_express.txt
输出:
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 内可以⽤用范围表示,如[a-z] 表示小写字母,[0-9] 表示0~9的数字, [A-Z]则是大写字母们。[a-zA-Z0-9]表示所有数字与英⽂文字符。 当然也可以配合^来排除字符。
例:搜索包含数字的行
$ grep -n '[0-9]' regular_express.txt
输出:
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首与行尾字符 ^ $
^ 表示行的开头,$表示行的结尾( 不是字符,是位置)这里^与[]里面使用的意义不同。它表示后面的串是在行的开头。
例:搜索the在开头的行
$ grep -n '^the' regular_express.txt
结果:
12:the symbol ‘*’ is represented as star.
例:搜索以小写字母开头的行
$ grep -n '^[a-z]' regular_express.txt
输出结果:
2:apple is my favorite food.
4:this dress doesn’t fit me.
任意一个字符. 与重复字符 *
*表示有0个或多个 某个字符。
例如 oo*, 表示第一个o一定存在,第二个o可以有一个或多个,也可以没有,因此代表至少一个o.
. 代表⼀一个任意字符,必须存在。 g??d 可以⽤用 ‘g…d’ 表示。 good ,gxxd ,gabd ……都符合。
例:前两个o一定存在,第三个o可没有,也可有多个。
$ grep -n 'ooo*' regular_express.txt
输出结果:
1:“Open Source” is a good mechanism.
问:搜索开头不是英文字母的行?
$ grep -n '^[^a-zA-Z]' regular_express.txt
问:$ grep -n '^$' regular_express.txt
表示什么?
显示空行,因为只有行首和行尾。
注意,让[]中的^ - 不表现特殊意义,可以放在[]里面内容的后面。’[+*?.!^ -]’ 表示含有+,*,?,, ., !, ˆ,空格,- 的串,注意[]里面有个小空格。
限定连续重复字符的范围 { }
. * 只能限制0个或多个, 如果要确切的限制字符重复数量,就用{范围} 。范围是数字用’,'隔开 {2,5} 表示2~5个,{2}表示2个,{2,} 表示2到更多个.
注意,由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用\转义一下。
例:搜索g后面跟2~5个o,后面再跟一个g的字符串的行。
$ grep -n 'go\{2,5\}g' regular_express.txt
输出:
18:google is the best tool for searching.
19:goooogle is the best tool for searching.
当要查找一个含有空格、制表符或双引号的字符串时,必须用单引号将其括起来。而查找包含单引号的字符串时,⽤双引号将字符串括起来,而且在每个单引号前加反斜线’\’.
例:$ grep “I\’m right” stan.memo
问:$ grep -n '\.$' regular_express.txt
表示什什么意思?(.为特殊符号)
以.结尾的行
忽略大小写,使⽤用-i选项
例: $grep -i ‘phD’ database.memo
找文件中不包含某字符串的行用-v选项,接收正则表达式 grep -E
():对字符串进行分组 - 需要使用转义
():将一个或多个字符捆绑在一起,当作一个整体进行处理;
例:找到abc连续出现至少两次的字符串
$ grep -n ‘\(abc\)\{2,\}’ reg.txt
例:找到连续出现至少两次c?r的字符串, 其中?可以是任何数字
$ grep -n ‘\(c[0-9]r\)\{2,\}’ reg.txt
扩展正则表达式的egrep 与扩展特殊符号 |
注意grep只支持基础表达式, 而egrep 支持扩展的, 其实egrep 是 grep -E 的别名而已。因此grep -E 支持扩展正则。
例:
$ egrep -v '^$|^#' regular_express.txt
输出:
“Open Source” is a good mechanism to develop programs.
apple is my favorite food.
问:
$ grep -i ‘^\(car\|good\)’ regular_express.txt
表示什么意思?
egrep -i ‘^(car|good)’
正则表达式中各运算符的优先级从高到低:(),[],* ? ,\,|(或)
字符 | 说明 |
---|---|
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。匹配输入字符串的开始位置。要匹配 ‘^’ 字符本身,请使用 ‘^’。 |
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 ‘$’ 字符本身,请使用 ‘$’。 |
+ | 匹配前面的子表达式一次或多次。要匹配 ‘+’ 字符本身,请使用 ‘+’。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ‘(’ 和 ‘)’。 |
\w | 匹配所有的字母、数字、下划线的字符 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ‘?’ 字符,请使用 ‘?’。 |
小练习:
例题1
正则表达式-Linux路径:
格式要求:
- 必须’/'开头
- 字符串只允许字母、数字、下划线
^\/(\w+\/?)+$
解析:
- 前后使用了 ‘^’ 和 ‘$’ ,代表这里要校验整个字符串(从字符串开头到结尾)。
- 接下来 '/'字符 ,这里用了斜杆转译,代表要以 / 开头。
- 使用 '()'将子表达式写在括号内。
- 括号内的表达式:’\w+’,匹配出现一个或多个字母、数字、下划线的字符。’/?’,匹配斜杠,可有可无。
- 括号外的+号,匹配括号内的规则,一次或者多次。
将上述分析总结:校验整个字符串 -> 以斜杠开头 + ((一个或多个字符串 + 可有可无的斜杆)* n(大于0)次) 。
例题2
请设计正则表达式,使用egrep命令找出ifconfig结果中所有包含IP地址的行。
分析:IP地址分为四块,前三块末尾都有’.’,而最后一个没有。故先匹配前三个,再匹配最后一个。匹配时,要注意兼顾所有情况。
ifconfig | egrep -n '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
最后,注大家码运隆昌!
如有错误,请予指正