Linux-正则表达式

1.正则表达式的定义:

  正则表达式通常用于判断语句中,使用字符串描述、匹配一系列符合某个规则的字符串。

正则表达式是由普通字符元字符组成。

  • 普通字符包括小写字母、数字、标点符号及一些其他符号。
  • 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。 

正则表达式模式都区分大小写

Linux-正则表达式_第1张图片

2.正则表达式的分类:

正则表达式根据从POSIX BRE或者POSIX ERE标准可以分为:

  • 基本正则表达式
  • 扩展正则表达式

可以使用:
man 7 regex
(可以使用 man手册帮助)

3.文本三剑客(grep  sed  awk)支持的正则表达式:

shell是不支持正则表达式的(shell支持的是通配符)。shell中的正则表达式只有个别命令支持的,一般常用的是文本三剑客。

支持正则的shell命令 正则类型
grep 默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符)
sed  默认使用基本正则表达式(BRE)
awk  使用扩展正则表达式(ERE)
egrep 或 grep -E 使用扩展的正则表达式(ERE)

 4.基本正则表达式:

支持的工具:grep、egrep、sed、 awk。(注意grep要配合-E或者-P使用)

元字符 含义及用法
表示转义字符,去掉特殊符号的特殊含义
匹配任意单个字符
^  匹配字符串开头的位置
$   匹配字符串末尾的位置
*   匹配前面的字符出现0~+∞
[list]   匹配list列表中的一个字符(列表中只要有一个符合即可)
[^list]    匹配任意非list列表中的一个字符
{n}  匹配前面的子表达式n次
{n,}  匹配前面的子表达式最少n次
{,n} 匹配前面的子表达式最多n次
{n,m}  匹配前面的子表达式n到m次
[ ]  代表单个字符
\?  1次或0次
^$    空行
.*   1~+∞

4.1转义字符的运用:

将特殊含义的字符转换为普通字符的含义:

被转义的特殊字符 转义前的含义作用
\ = 具有赋值的作用,或则进行字符判断
\ ! 取反
\ & 单个&符可以将命令挂在后台上,两个是逻辑符号且的作用
\ $ 取值变量的作用

将普通字符转换为特殊作用的字符:

被赋予新含义的普通字符 现在拥有的作用
\n  换行
\t 转化为制表符
\w(小写) 匹配包括下划线的任何单词字符
\W(大写) 匹配任何非单词字符。等通于"[^A-Za-z0-9_]"
\r 转换后是回车符
\d 匹配一个数字字符
\D 匹配一个非数字字符。等价于[^0-9]
\s(小写) 空白符
\S(大写)   非空白符

4.2.中括号表达式:

普通中括号包围的字符组,表示某个单个字符匹配中括号内的任意字符即匹配成功

  1. x[abc]z : 可以匹配包含“xaz”、“xbz”、“xcz”的字符串
  2. 取反表示法: 中括号内开头使用 ^ ,表示只要不是中括号内的字符就匹配   

 x[ ^abc]z : 可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串 

特殊元字符在中括号中匹配:

  • 想要在中括号中匹配: ^ ,需要将其放在 中括号非开头的位置 ,如:[a^]
  • 想要在中括号中匹配: - ,需要将其放在 开头位置或结尾位置 ,如:[abc-]、[-abc]
  • 想要在中括号中匹配: ] ,需要将其放在 开头位置 ,如:[]abc]

 位置匹配:

^ : 匹配行首

$ : 匹配行尾

\b   匹配单词边界处的位置(开头和结尾) \bword\b 等价于 \

\<   匹配单词开头处的位置

\>   匹配单词结尾处的位置

\B   匹配非单词边界处的位置

字符类:

[:alnum:]   字母和数字
[:alpha:]  代表任何英文大小写字母 A-Z  a-z
[:lower:]    小写字母
[:upper:]  大写字母
[:blank:] 空白字符
[:space:]  包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:]  不可打印的控制字符(退格、删除、警铃...)
[:digit:]  十进制数字
[:xdigit:] 十六进制数字
[:graph:]  可打印的非空白字符
[:print:]   可打印字符
[:punct:]  标点符号

量词:
\{m\} : 表示匹配前一个字符或前一个子表达式m次

\{m,n\} : (m

\{m,\} : 表示匹配前一个字符或前一个子表达式至少m次

\{,n\} : 表示匹配前一个字符或前一个字表达式最多n次(匹配0次也算是成功)

*  表示前一个字符或前一个子表达式匹配0次或多次,等价于:{0,}

.*   匹配任意长度的任意字符

5.扩展正则表达式的元字符:

egrep 默认使用的 是扩张正则

支持的工具:egrepawk,注意:使用grep要配合-E或者-P使用,sed要配合-r使用。
 

元字符 含义及用法
+    匹配前面子表达式1次以上,例: go+d,将匹配至少一个o,如god、good、goood等
 匹配前面子表达式0次或者1次,例: go?d,将匹配gd或god
()    将括号中的字符串作为一个整体,例1: g(oo)+d,将匹配oo整体1次以上,如good、gooood等

 以或的方式匹配字符串,例:g(oo|la)d,将匹配good或者 glad

* 匹配前面字符任意次
{n} 匹配n次
{m,n} 至少m,至多n次

扩展常用的量词:

  • +  表示匹配前一个字符或前一个子表达式1或多次,即至少一次 等价于 {1, }
  • ?  表示匹配前一个字符或前一个子表达式0或1次,等价于 {0,1} 等价于 {,1}

分组捕获和反向引用:
使用小括号()包围一部分正则表达式,这部分正则表达式即成为一个分组整体,也称为一个子表达式。

分组后可以使用 \N 来反向引用对应的分组匹配结果,N是1-9的正整数,\1表示第一个分组表达式的匹配结果,\2表达第二个分组表达式的匹配结果。

注意:反向引用引用的是分组匹配后的结果,不是分组表达式

例如:正则表达式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”

你可能感兴趣的:(正则表达式)