全正则表达式学习记录

正则表达式:就是用某种模式去匹配一类字符串的公式,它是由一串字符和元字符构成的字符串,所谓元字符,就是用以阐述字符表达式的内容、转换和描述各种操作信息的字符。

基础正则表达式

1. " . "(一个点)符号

用于匹配除换行符以外的任意一个字符。
示例:其中红色为匹配部分
在这里插入图片描述

2. " * " 符号

用于匹配前一个字符0次或任意多次
示例:由于/etc/passwd中没有rt、rrt这样的匹配,所以该表达式只找出了包含t的行(r匹配了0次)。
全正则表达式学习记录_第1张图片

3. “\{n,m\}” 符号

虽然"*“可以重复匹配前一个字符,但不能精确控制次数,使用”\{n,m\}" 则能灵活控制字符重复次数,典型的有以下3种形式:

  • \{n\} 匹配前面的字符n次
    示例:’ro\{2\}t’ 表示匹配以r开头后面接重复2次o再接t的字符 root 。
    在这里插入图片描述
  • \{n,\} 匹配前面的字符至少n次以上(含n次),示例:在这里插入图片描述
  • \{n,m\} 匹配前面的字符n到m次
    在这里插入图片描述
4. “^” 符号

这个符号位于键盘数字6上面,又称尖角号。用于匹配开头的字符 。
示例:“^root”表示匹配以root开头的行
在这里插入图片描述

5."$"符号

和上面的"^“号相对,”$"用于匹配尾部。
示例:"abc$“表示以abc结尾的行,”^$“因为中间什么都没有,表示空行。下面”^r.*h$"表示以r开头,中间有一串任意字符,以h结尾的行。
在这里插入图片描述

6."[]"符号

这是一对方括号,用于匹配括号内出现的任一字符。比如说单项选择题答案可能是A,B,C,D一种,用正则表达式就是[ABCD]。如果遇到比较大的范围,比如说匹配任意一个大写字母,就要用"-“做范围限定,写成[A-Z],要匹配所有字母则写成[A-Za-z],注意,这里的”-“不是充当一个字符。数字则写成[0-9]。
如果要匹配不是大写字母A,B,C,D,使用”^",这个符号出现在[]中代表取反,写成[^A-D]。

7."\"符号

转义符号,上面提到"-“号在[]中有特别含义,举个例子,有个固定电话021-88888888,
也可写成021 88888888区号和电话号码中间用空格隔开,一个是”-",一个是空格,那我们不能这么写:[-],为了表示其作为一个字符的本意,就要使用转义符"\“了,那这里应该写成[\ \-]其实在这里这个表达式中总共写了4个”\",但你只能看到2个,就是因为“\”本身在这里就有特殊意义,如果只写两个,你就看不到它了本文中如果有些地方符号显示不正常,可能就是没有进行转义,怪我粗心了。很多地方很多符号都需要进行转义,就需要使用"\"进行转义。
在这里插入图片描述

8."\<“符号和”\>"符号

这两个符号分别用于界定单词的左边界和右边界。如果两个组合在一起,能够精确匹配,如"\"可以精确匹配单词hello.
示例:
全正则表达式学习记录_第2张图片
以上8种是常见的元字符,还有些不太常用的字符,这些字符中有不少可以使用之前的8种基础元字符来表示。以下只作简单示例

9."\d"符号

匹配一个数字,等价于[0-9],使用grep匹配这种正则表达式时可能会有无法匹配的问题。
全正则表达式学习记录_第3张图片

10."\b"符号和"\B符号"

“\b符号"匹配单词的边界,而”\B"符号则刚好相反,匹配非单词边界。
全正则表达式学习记录_第4张图片

11."\w"符号和"\W"符号

"\w"符号 匹配字母、数字和下划线,等价于[A-Za-z0-9]
“\W"符号与”\w"相反,匹配非字母、非数字、非下划线,等价于[^A-Za-z0-9]。全正则表达式学习记录_第5张图片

12."\n"符号

匹配一个换行符。

13."\r"符号

匹配一个回车符。

14."\t"符号

匹配一个制表符。

15."\f"符号

匹配一个换页符。

16."\s"符号

匹配任何空白字符。

17."\S"符号

匹配任何非空白字符。

扩展正则表达式

扩展正则表达式是针对基础正则表达式的一些补充,比基础正则表达式多了几个重要的符号,使用扩展符号时,需要使用egrep命令。

  1. "?"符号
    "?"符号用于匹配前一个字符0次或1次,所以’ro?t’仅能匹配rot或rt。
  2. "+"符号
    "+"符号用于匹配前一个字符1次以上,所以’ro+t’可以匹配rot,root等。
  3. "|"符号
    "|"是"或"的意思,即多种可能的罗列,彼此间是一种分支关系。
    比如有的地方固定电话的区号是3位数,有的却是4位数:
#区号是3位数
^0[0-9]\{2\}-[0-9]\{8\}
#区号是4位数
^0[0-9]\{3\}-[0-9]\{8\}
#两种区号
^0[0-9]\{2,3\}-[0-9]\{8\}
#也可以用"|"符号,但显然比上面这种更麻烦
^0[0-9]\{2\}-[0-9]\{8\}|^0[0-9]\{3\}-[0-9]\{8\}
  1. "()"符号
    "()“符号通常需要和”|"符号联合使用,用于枚举一系列可替换的字符。
#使用"()"和"|"定义连接符的写法
^0[0-9]\{2,3\}(-| )[0-9]\{8\}
#这样021-88888888和0511 88888888都能匹配
#这种写法也可以用[]替换
^0[0-9]\{2,3\}[\ \-][0-9]\{8\}
#虽然"()"和"|"可以和"[]"混用,但在某些场景下"()"和"|"可以做得更好

通配符

通配符是一种特殊的语句,主要包含"*“号和”?“号(还有”{}","^","!")。主要用来模糊搜索文件,使用它代替一个或多个真正的字符,尤其是在不确定完整的文件名的情况下,用来匹配符合条件的文件。

  1. "*"符号代表0个或多个字符,示例:
#显示当前目录所有以.doc为后缀名的文件
ls -l *.doc 
  1. "?"符号,当它作为通配符使用时,代表任意一个字符:
#列出所有以A开头的两个字符名并以.doc为后缀的文件
ls -l A?.doc
  1. "{}"符号可匹配所有括号内包含的以逗号隔开的字符。
#列出所有以字母A,B,C开头,以.doc结尾的文件
ls -l {A,B,C}.doc
#当然,使用"[]"也行
ls -l [A-C].doc
#但是如果要列出以字母AB,CD开头以.doc结尾的文件就只能用"{}"了,想一想为什么 

"{}“还支持嵌套的通配,以”{x,y}"为例,如果x和y各自本身也是通配符,那效果就更强大了。

#想一想下列示例的含义
ls -l {[A-Z]*.doc,[0-9]??.txt}
  1. "^“符号和”!“符号
    这两个符号往往和”[]“一起使用,当出现在”[]"中的时候代表取反,所以[^A]和[!A]代表不是A。
通配符和正则表达式之间存在一些差异,特别是有些相同的字符既用在正则表达式中又用在通配符中,极易造成混淆和干扰,只有通过多读多想才能加深理解和认识!简单的说,正则表达式主要用在文件内容的匹配上,而通配符主要用在文件名的匹配上,可以用这种方法来区别二者。

你可能感兴趣的:(Linux,笔记)