【Linux】正则表达式

来源:互联网 发布:android登陆界面源码 编辑:程序博客网 时间:2024/06/16 21:34

正则表达式是处理字符串的一种表示方法,分为基准正则表达式 和扩展正则表达式。

注:是grep正则表达式的Extended规范,Basic规范也有这些语法,只是字符?+{}|()应解释 为普通字符,要表示上述特殊含义则需要加\转义。如果用grep而不是egrep,并且不加-E参数,则 应该遵照Basic 规范来写正则表达式。 (一定要注意!!!!!)

注意: 正则表达式参数用单引号括起来了,因为正则表达式中用到的很多特殊字符在Shell中也有特殊 含义(例如),只有用单引号括起来才能保证这些字符原封不动地传给grep命令,而不会被Shell解释掉。

grep 就是支持正则表达式的工具。我们使用grep工具来处理字符串。

grep的基本语法

grep --color=atuo是关键词部分使用颜色显示-n 显示行号 -i 忽略大小写-R 递归查找-v 反向选择,不包括的显示-A 后面加数字,为after的意思,除了列出改行,后序的n行也列出来-B 后面加数字,为before的意思,除了改行,之前的n行也列出来

在关键词显示方面,每次都要加 –color=auto,比较麻烦,可以用alias。
在~/.bashrc 这个文件内 加上 alias grep=’grep –color=auto’
然后 执行 source ~/.bashrc
这样每次执行grep 都会自动加上颜色显示。

正则表达式的组成

正则表达式由三部分组成字符类,数量限定符 位置限定符

字符类

这里写图片描述

注:下面编辑一个文件,以文档练习语法,

可以在Linux下 直接下载,把下面的东西复制到bash上,
wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.tx

或者复制下面的内容

"Open Source" is a good mechanism to develop programs.apple is my favorite food.Football game is not use feet only.this dress doesn't fit me.However, this dress is about $ 3183 dollars.GNU is free air not free beer.Her hair is very beauty.I can't finish the test.Oh! The soup taste good.motorcycle is cheap than car.This window is clear.the symbol '*' is represented as start.Oh! My god!The gd software is a library for drafting programs.You are the best is mean you are the no. 1.The world <Happy> is the same with "glad".I like dog.google is the best tools for search keyword.goooooogle yes!go! go! Let's go.# I am VBird

注意:最后一行是一行空行

练习开始

由于.是特殊字符,所以需要转义 .

例题1、grep 基本语法,-i -n

这里写图片描述

例题2、[]匹配括号中的任意字符串

这里写图片描述

在[0-9]表示范围

这里写图片描述

在[^ abc] 表示匹配除括号内字符外的任意字符

这里写图片描述

数量限定符

grep匹配是贪心匹配,尽可能多的匹配,在练习中细细体会这个贪心匹配。
这里写图片描述

例题3、任意一个字符. 与重复字符 *

.(小数点):代表的是一定有任意一个字符的意思
*(星号):代表的是重复前面一个单元0次或多次的意思,为组合形态

找出匹配g开头g结尾的 一共四个字符
这里写图片描述

grep -n 'o*' regular_express.txt

可以猜一下上面打出什么字符串

注意*可以匹配重复前一个单元0次的 字符串。
所以 会打出所有的字符串

至少两个 o 以上的字符串时,就需要 ooo*

这里写图片描述

打出g开头 g结尾的 任意字符串

你可能猜想是g*g 这种想法是错误的,
分析:*可以匹配前面单元0次,所以整个得到的是g,gg,ggg,gggg类似的

所以正确的是 g.g 前面加上一个. 表示匹配一次任意字符, 表示匹配之前的任意字符 0次或多次

这里写图片描述

比较? * + 的区别

这里写图片描述

分析:
? 匹配前面的一个单元a 0次或1次,ca 匹配1次,c 匹配0次,ca匹配1次
+ 匹配前面一个单元a 1次或多次,ca 匹配1次,caaaa匹配多次
* 匹配前面一个单元a 0次或多次, ca 1次,c 0次,caaaaa 多次

例题4、限定连续 RE 字符范围 {}

这个就比较容易体现贪心匹配, 尽可能的匹配,

这里写图片描述

位置限定符

这里写图片描述

查找qq邮箱

grep  -E '^[1-9][0-9]{3,11}@qq\.com$'

分析:
^[1-9] 表示 开始部分匹配1-9任意一个字符
[0-9]{3,11}表示之后匹配0-9任意字符出现至少3次,最多11次
com$ 表示行末位置匹配com

匹配电话号码

grep  -E '^1[35678][0-9]{9}$'

分析:电话号码11位,
^1 表示起始位置匹配1
[25678] 表示第二位匹配35678中的任意一个字符
[0-9]{9}$ 表示 剩余的9位匹配0-9的任意字符,并且以数字结尾

特殊字符

这里写图片描述

匹配ip地址

grep  -E '^[1-2][0-9]{0,2}(\.[0-9]{1,3}){3}$'

分析:
. 表示对.进行转义
(.[0-9]{1,3}){3} 表示已 前面的括号里面为一个单元出现3次

注:更多的例子 可以看《鸟哥的Linux私房菜:基础学习篇》