有段时间没有用到正则了,发现很多语法都忘记了,把网上的正则表达式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分钟入门教程。