正则表达式学习
1、字符匹配
-
. 匹配任意单个字符
-
[] 匹配指定范围内的任意字符,比如[a-z]指的是小写字母,[0-9]指的是任意一个数字
-
[^] 匹配指定范围外的任意字符,比如
[^0-9]
指的是出了数字外的任意一个字符 -
[:alnum:] 匹配字母和数字
-
[:alpha:] 代表任意大小写字母,即a-z,A-Z
-
[:lower:] 小写字母
-
[:upper:] 大写字母
-
[:blank:] 空格和制表符
-
[:space:] 水平和垂直的空白字符,比blank的范围广
-
[:cntrl:] 不可打印的控制字符(比如退格、删除、警铃等)
-
[:digit:] 十进制数字
-
[:xdigit:] 十六进制数字
-
[:graph:] 可打印的非空白字符
-
[:print:] 可打印字符
-
[:pumct:] 标点符号
2、匹配次数
*
*前面的符号可以出现0次或者n次,比如n*
m可以是m、nm、nnm、nnnnm- .* 任意长度的任意字符串
- ? 一般需要加\转义,匹配前面的字符0次或者1次,比如n?m表示m或者nm
- \+ 一般需要转义,表示+前面的字符至少出现一次,比如n+m表示nm或者nnnnm
- \{n\} 一般需要转义,表示匹配前面的字符n次,比如p{2}q表示ppq
- \{m,n\} 加\转义,表示匹配前面的字符m到n次,比如p{2,4}q表示ppq、pppq、ppppq
- \{,n\} 加\转义,表示前面的字符最多匹配n次,比如p{,3}q表示q,pq,ppq,pppq
- \{n,\} 加\转义,表示前面的字符至少匹配n次,比如p{3,}q表示pppq,ppppq,pppppq
3、位置锚定
- ^ 行首锚定,用于模式的最左侧
- $ 行尾锚定,用于模式的最右部
- \<pattern 表示该模式可以出现在单词的词首
- pattern\> 表示该模式可以出现在单词的词尾
- \b 表示该模式既可以出现在单词的词首,也可以出现在单词的词尾
4、分组捕获
分组:通过\(\)将一个或者多个字符绑定在一起,形成一个模式,对这个模式当成一个整体进行处理,比如\(root\)+表示匹配root至少一次,比如root,rootroot,rootrootroot
分组括号中匹配到的内容会被系统记录于内部的变量中,这些变量用\1,\2,\3命名
\1表示从左侧起第一个左括号及对应右括号之间的模式匹配得到的字符结果,\2表示从左侧第二个左括号到与之相应的右括号之间的模式匹配得到的结果
比如对于\(string1\+\(string2\)*\)这个模式,\1表示string1+string2*匹配到的结果,而\2表示string2匹配到的结果
#示例:
[root@7 shell_test]# echo rootxxroot |grep '\(r..t\).*\1'
# 上面的 \1 指代的是 \(r..t\) 匹配到的字符 root 而不是 r..t 这个模式类型,r..t匹配到root后,\1自动变成了root,所以只能匹配# rootxxroot
[root@7 shell_test]# echo rootxxrxxt |grep '\(r..t\).*\1'
# 这里就无法匹配到,因为\1指代的变成了root,匹配不了rxxt
#示例:
[root@7 shell_test]# grep '^\(.\+\):.*\1$' /etc/passwd
# ^\(.\+\):.*\1$ 以任意字符开头并至少存在一个字符直到:,中间也是任意字符,最后以 ^\(.\+\) 匹配到的内容结尾
# ^\(.\+\): 以任意字符开
# \1 以上式匹配到的内容结尾
#.+表示1-无穷的字符串
#.*表示0-无穷的字符串
或者和\|一起使用表示或条件:
\(c\|C\)at ---> 表示cat或者Cat