什么是正则表达式?一起来看看吧!

84 阅读4分钟

1、正则表达式简介

使用正则时尽量加引号,用来匹配字符串(命令结果、文本内容)

正则的匹配模式,默认是贪婪模式,所有满足要求的都要。

编程语言支持高级正则表达式 grep、sed、awk、文本编辑器、IDE等

1.1 正则分类:

  • 基本正则 (要加的////比较多)
  • 扩展正则
  • 高级正则 prel(我们目前阶段用不到)

man 7 可以查看正则更多的详细信息

1.2 基础和扩展的区别:

  • 扩展正则中这些元字符可直接使用: ? + { } | ( )
  • 基础正则中这些元字符前 需要加反斜线转义: ? + { } | ( )

基础正则 要在前面加\反斜杠;扩展正则 不需要加\反斜杠。

1.3 正则在运维工作中的应用范围:

  • 配置文件
  • 程序脚本
  • 命令输出结果
  • 日志文件

1.4 搜索字符的两种方法:

  • 精确匹配,不使用任何元字符,也就是不使用正则表达式
  • 正则表达式搜索,正则表达式不难,但是可读性非常差

grep -E 、 sed -r 、 egrep 、 awk 都是扩展正则表达式

推荐使用grep -E

2、元字符

 `基本正则:`
 .      匹配任意单个字符
 [^]    取反,  ^在[]里的,代表是取反;不在[]里的代表是代表是开头
 []     指定范围内的任意单个字符,[wang]可以是w或者a或者n或者g
 [ ]    空格
 [.]    方括号里的点,就只是点,不能匹配为任意字符。
 [:alnum:]     字母和数字
 [[:alnum:]]   任意字母和数字 
 [:space:]     空格、制表符、换行符
 [:blank:]     空白字符(空格和制表符)
 [a-zA-Z]      大小写字母
 [0-9a-zA-Z]   数字和字母,等价于 \w
 [开始-结束]     从开始到结束,只能匹配单个
 [3-59]        注意是3459,也就是3-5,再加上9
 [:punct:]     匹配所有标点符号
 [:print:]     可打印字符
 \w            等价于[_[:alnum:]],代表任意单词或数字或_,后面注意还有下划线!!
 \d或 \D不要用,不支持!
 `扩展正则:`
 匹配],要把]放在第一位
 匹配^,^不能放在第一位,放在第一位会认为是取反
 匹配-,-不能放中间,因为会认为是...到...的意思

示例:

 `1`
 [root@localhost ~]#ls /etc/|grep rc[.0-6]     // [.0-6] :代表是.或者1-6的范围。 [.]点在方括号里就代表是点,不是单个任意字符。
 rc0.d
 rc1.d
 rc2.d
 rc3.d
 rc4.d
 rc5.d
 rc6.d
 rc.d
 rc.local
 ​
 `2`
 [root@localhost ~]#  grep r..t /etc/passwd   //..代表任意两个字符
 root:x:0:0:root:/root:/bin/bash
 operator:x:11:0:operator:/root:/sbin/nologin
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 ​
 `3`
 [root@localhost ~]#  echo abc |grep 'a.c'    //.代表任意字符
 abc
 [root@localhost ~]#  echo abc |grep 'a.c'  //点前加反斜杠就是.
 [root@localhost ~]#  echo a.c |grep 'a.c'  
 a.c
 [root@localhost ~]#  echo abc |grep [a.c]  //a或者.或者c
 ​
 `4`
 [root@localhost ~]# ls |grep '[^a-z].txt'   
 #显示非小写字母
 ​
 `5`
 [root@localhost ~]#  echo "x.y"|grep "x[^abc]y"
 x.y   //取反,非a 非b 非c
 [root@localhost ~]#  echo "xay"|grep "x[^abc]y"
 [root@localhost ~]#  

3、量词

量词表示次数

量词写在字符串后面,代表该字符串出现的次数。

 *       代表前面的字符出现任意次,范围是0-正无穷,属于贪婪模式
 .*      代表任意长度的任意字符,不包括0
 ?       代表前面字符出现0次或1次
 +       1到正无穷
 .+      代表从1到正无穷个字符
 [0-9]*     代表数字09  出现了正无穷次
 {1,3}    代表1-3次
 {1,}     代表1到正无穷
 {,3}     代表0-3次
 {3}      3次
 [0-9]{3}   0-9出现3

// 注意:通配符的代表单个字符;正则的代表0次或者1次

 小拓展:怎么匹配邮箱?
 echo "1403544456@qq.com" |grep -E "[0-9a-zA-Z]+@[0-9a-zA-Z]+.[a-zA-Z]+"

示例:

 `1`
 [root@localhost ~]#  echo google |grep 'go{2}gle'
 google    //o出现2次
 [root@localhost ~]#  echo gooogle |grep 'go{2,}gle'
 gooogle    //o出现2次以上
 [root@localhost ~]# echo goooooogle |grep 'go*gle'    //表示0次到任意次
 [root@localhost ~]#  echo ggle |grep "go?gle" 
 ggle
 [root@localhost ~]#  echo gogle |grep "go?gle" 
 gogle   //出现0-1次
 ​
    

4、位置锚定

意思是字符出现在什么位置

 ^   开头,如果加方括号[^],就是取反的意思。
 $   结尾,bash$就是以bash结尾
 <或者\b         字符串的开头
 >或者\b         字符串的结尾
 <[a-z]    小写字符开头的字符串
 <a-z\ >   单个小写字母??????
 (1|2|3)   123
 ^[[:space:]]*$    空白行

// 注意:下划线是一个单词,属于单词的一部分,