有段时间没有用到正则了,发现很多语法都忘记了,把网上的正则表达式30分钟入门教程复习了一遍,顺利做个笔记,便于复习。也在此感谢正则表达式30分钟入门教程的作者deerchao


正则表达式是什么

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。它是用来进行文本匹配的工具,能更精确地描述你的需求。总之,在我们的工作中,用来精确匹配,非常有用。

元字符

元字符(metacharacter),是正则表达式规定的一类特殊代码

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

重复

一般默认匹配都是贪婪模式,尽可能匹配更多,可以开启懒惰模式,尽可能少的重复

代码/语法 懒惰模式 说明
  • |*?|重复零次或更多次 +|+?|重复一次或更多次 ?|??|重复零次或一次 {n}|-|重复n次 {n,}|{n,}?|重复n次或更多次 {n,m}|{n,m}?|重复n到m次

字符转义

如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用.和*。当然,要查找\本身,你也得用\.

一些常用的组合方式

表达式 含义
^$ 空的行
.* 任意个任何字符
[0-9] 一个数字,相当如\d
[a-Z] 一个字母
[a-Z0-9] 一个任何字符,相当于\w
[^xyz] 匹配除了xyz以外的任意字符

例子

  • 通过\b精确匹配单词world,这里-o是只显示匹配项的意思

    [root@hexo test]# echo "hello,world,haha"|grep -o '\bworld\b'
    world
    
  • 找的是world后面不远处跟着一个blue,这里.*连在一起就意味着任意数量的不包含换行的字符

    [root@hexo test]# echo 'Hello, world, welcome to blue fat blog' |grep -o '\bworld\b.*\bblue\b'
    world, welcome to blue
    
  • 匹配5个字符的单词,{n}表示必须连续重复匹配n次,{n,m}则是重复的次数不能少于n次,不能多于m次,这里大括号前加了\用来转义.

    [root@hexo test]# echo 'Hello, world, welcome to blue fat blog' |grep -o '\b\w\{5\}\b'
    Hello
    world
    [root@hexo test]# echo 'Hello, world, welcome to blue fat blog' |grep -o '\b\w\{4,5\}\b'
    Hello
    world
    blue
    blog
    
  • egrep支持扩展正则表达式,可以不需要转移符,下面是匹配固话号码

    [root@hexo test]# egrep -o  '[0-9]{3}-[0-9]{8}' test.txt
    027-86933073
    027-86913073
    
    [root@hexo test]# egrep -o '0[0-9]{2}-[0-9]{8}' test.txt
    027-86933073
    027-86913073
    
  • 来看一个复杂的表达式:(?0\d{2}[) -]?\d{8}

    这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})

  • IP地址匹配表达式

    ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)


正则表达式博大精深,这里只是记录了一些基础的部分,要想详细了解,建议学习下文章开头介绍的正则表达式30分钟入门教程。