正则表达式详解

正则表达式详解

## 一、定义## 一、定义正则表达式,Regular Expression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
## 二、分类(1) 基本正则表达式:BRE,Basic RE(2) 扩展正则表达式:ERE,Extended RE
## 三、元字符上述二者的元字符不同,说到元字符,要介绍一下它的概念:元字符:meta character, 不能够再被分割,用于表达通配或控制的功能。
有一些还有一些特殊的通配符,还需要再加上[]才能使用,这些也支持取反格式:[^[]]
通配符号 | 含义———— | —— [:space:] | 空白字符[:punct:] | 标点符号[:lower:] | 所有小写字母[:upper:] | 所有大写字母[:alpha:] | 所有大小写字母[:digit:] | 所有数字[:alnum:] | 所有数字和大小写字母
**1. 基本正则表达式的元字符****(1) 字符匹配**
符号 | 含义—— | ——. | 匹配任意单个字符[] | 匹配指定范围内的任意单个字符[^] | 匹配指定范围外的任意单个字符示例:`~]# grep “r[[:alpha:]][[:alpha:]]t” /etc/passwd`在/etc/passwd文件中,匹配r和t之间只能出现两个字母的行。**(2) 匹配次数**用在要制定其出现的次数的字符的后面,用于限制其前面字符出现的字数
符号 | 含义—— | ——* | 匹配前面的字符任意次,0次,1次,多次均可.* | 匹配任意长度的任意字符\\? | 匹配其前面的字符0次或1次,即前面的字符是可有可无的\\+ | 匹配其前面的字符1次或多次,即前面的字符要出现至少一次\\{m\\} | 匹配其前面的字符m次\\{m,n\\} | 匹配其前面的字符至少m次,至多n次其中,”\\”符号仅用于基本正则表达式匹配,如果扩展正则表达式则不需要”\\”做转义。
> 正则表达式默认工作在贪婪模式例如,grep “r.*” /etc/passwd,在匹配时,会匹配r字符开头一直到最后的所有字串。
**(3) 位置锚定**使用场景:有时需要限定匹配的字符串只能出现在一行的某个位置,则需要使用位置锚定
符号 | 含义—— | ——^ | 行首锚定,用于模式的最左侧$ | 行尾锚定,用于模式的最右侧^PATTERN$ | 用模式匹配整行^$ | 匹配空白行,不包括任何字符,包括空格\\< 或 \\b | 词首锚定,用于单词模式的左侧\\> 或 \\b | 词尾锚定,用于单词模式的右侧\\<PATTERN\\> | 精确匹配单词
练习题:(1) 显示/etc/passwd文件中,不以/bin/bash结尾的行;`~]# grep -v “/bin/bash$” /etc/passwd`(2) 找出/etc/passwd文件中的两位数或三位数;`~]# grep “\<[[:digit:]]\{2,3\}\>” /etc/passwd`(3) 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中以至少一个空白字符开头,且后面存在非空白字符的行;`~]# grep “^[[:space:]]\+[^[:space:]]\+” /etc/rc.d/rc.sysinit`(4) 找出“netstat -tan”命令的结果中,以“LISTEN”后跟0、1或多个空白字符结尾的行;`~]# netstat -tan | grep “\<LISTEN[[:space:]]*$”`**(4) 分组及引用**使用场景:- 有时需要匹配多个字符的组合出现0、1或多次,这就需要将这多个字符组成一组,一起进行后续的次数匹配或位置锚定;- 有时需要让前面匹配到的字符串后面再次出现;
**分组符号:**\\(PATTERN\\) : 将某个匹配模式分组,例如\\(xy\\)*ab,表示前面的xy是一个整体,可以一起出现0、1或多次。> 注意:括号可嵌套,但不可交叉!
**引用符号:**分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为\1, \2, \3 …,其中
符号 | 含义—— | ——\1 | 模式从左侧起,第一个括号以及与之匹配的右括号之间的模式所匹配到的字符;\2 | 模式从左侧起,第二个括号以及与之匹配的右括号之间的模式所匹配到的字符;\3 | 模式从左侧起,第三个括号以及与之匹配的右括号之间的模式所匹配到的字符;示例:编辑一个文件,其中包含如下内容:He loves his lover.He likes his lover.She like her liker.She loves her liker.并筛选出前后两个lxxe字段在同一行中是相同的字段。“`~]# vim lover.txtHe loves his lover.He likes his lover.She like her liker.She loves her liker.~]# grep “\(l..e\).*\1” lover.txtHe loves his lover.She like her liker.“`**2.扩展正则表达式的元字符**egrep,支持扩展的正则表达式实现类似于grep文本过滤功能,功能与grep -E相同。**(1) 字符匹配**

符号 | 含义—— | ——. | 匹配任意单个字符[] | 匹配指定范围内的任意单个字符[^] | 匹配指定范围外的任意单个字符
**(2) 匹配次数**用在要制定其出现的次数的字符的后面,用于限制其前面字符出现的字数
符号 | 含义—— | ——* | 匹配前面的字符任意次,0次,1次,多次均可.* | 匹配任意长度的任意字符? | 匹配其前面的字符0次或1次,即前面的字符是可有可无的+ | 匹配其前面的字符1次或多次,即前面的字符要出现至少一次{m} | 匹配其前面的字符m次{m,n} | 匹配其前面的字符至少m次,至多n次
**(3) 位置锚定**使用场景:有时需要限定匹配的字符串只能出现在一行的某个位置,则需要使用位置锚定
符号 | 含义—— | ——^ | 行首锚定,用于模式的最左侧$ | 行尾锚定,用于模式的最右侧^PATTERN$ | 用模式匹配整行^$ | 匹配空白行,不包括任何字符,包括空格\\< 或 \\b | 词首锚定,用于单词模式的左侧\\> 或 \\b | 词尾锚定,用于单词模式的右侧\\<PATTERN\\> | 精确匹配单词
**(4) 分组及引用**使用场景:- 有时需要匹配多个字符的组合出现0、1或多次,这就需要将这多个字符组成一组,一起进行后续的次数匹配或位置锚定;- 有时需要让前面匹配到的字符串后面再次出现;
**分组符号:**(PATTERN) : 将某个匹配模式分组,例如(xy)*ab,表示前面的xy是一个整体,可以一起出现0、1或多次。> 注意:括号可嵌套,但不可交叉!
**引用符号:**分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为\1, \2, \3 …,其中
符号 | 含义—— | ——\1 | 模式从左侧起,第一个括号以及与之匹配的右括号之间的模式所匹配到的字符;\2 | 模式从左侧起,第二个括号以及与之匹配的右括号之间的模式所匹配到的字符;\3 | 模式从左侧起,第三个括号以及与之匹配的右括号之间的模式所匹配到的字符;
**(5) 或者符号“|”**或者符号“|”代表是的该符号整个左侧和整个右侧。例如:
表现形式 | 含义———— | ——a \| b | 表示a或者bC \| cat | 表示C或者cat(C \| c)at | 表示Cat或cat
egrep练习题:(1) 显示/etc/passwd文件中,不以/bin/bash结尾的行;`~]# egrep -v “/bin/bash$” /etc/passwd`(2) 找出/etc/passwd文件中的两位数或三位数;`~]# egrep “\<[[:digit:]]{2,3}\>” /etc/passwd`(3) 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中以至少一个空白字符开头,且后面存在非空白字符的行;`~]# egrep “^[[:space:]]+[^[:space:]]+” /etc/rc.d/rc.sysinit`(4) 找出“netstat -tan”命令的结果中,以“LISTEN”后跟0、1或多个空白字符结尾的行;`~]# netstat -tan | egrep “\<LISTEN[[:space:]]*$”`(5) 找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少有三种实现方式。方法1:`~]# grep -i “^s” /proc/meminfo`方法2:`~]# grep -E “^(s|S)” /proc/meminfo`方法3:`~]# grep “^[sS]” /proc/meminfo`(6) 显示当前系统上root、centos或user1用户的相关信息;“`~]# grep -E “^(root|centos|user1)\>” /etc/passwdroot:x:0:0:root:/root:/bin/bashcentos:x:500:500::/home/centos:/bin/bashuser1:x:501:501::/home/user1:/bin/bash“`(7) 找出/etc/rc.d/init.d/functions文件中,某单词后面跟一个小括号的行;`~]# egrep “[_[:alnum:]]+\(\)” /etc/rc.d/init.d/functions`> 这里面要注意”[\_[:alnum:]]+\(\)” 的表达方式,代表()之前,可以是字母、数字以及_字符。
(8) 使用echo命令输出一个绝对路径,使用egrep取出其基名;`~]# echo “/etc/sysconfig/network-scripts/ifcfg-eth0” | egrep -o “[^/]+/?$” | cut -d’/’ -f1`进一步:取出其路径名。`~]# echo “/etc/sysconfig/network-scripts/ifcfg-eth0” | egrep -o “/.*/”`(9) 找出ifconfig命令结果中的1-255之间的数值;`~]# ifconfig | egrep –color=auto ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’ `(10) 找出ifconfig命令结果中的IP地址;`~]# ifconfig | egrep “\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>”`> 这个地方需要注意的就是:IP地址的特点是a.b.c.d,其中,a,d为1-254的数字;b,c为0-254的数字;
(11) 添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;“`~]# useradd bash~]# useradd testbash~]# useradd basher~]# useradd -s /sbin/nologin nologin~]# tail -4 /etc/passwdbash:x:502:502::/home/bash:/bin/bashtestbash:x:503:503::/home/testbash:/bin/bashbasher:x:504:504::/home/basher:/bin/bashnologin:x:505:505::/home/nologin:/sbin/nologin
~]# egrep “^(\<[^:]+\>).*\1$” /etc/passwdsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltbash:x:502:502::/home/bash:/bin/bashnologin:x:505:505::/home/nologin:/sbin/nologin“`> 注意:当无须用到元字符去编写模式时,使用**fgrep**必能更好!!!!

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87468

(1)
N27_sapbcsN27_sapbcs
上一篇 2017-09-20 17:47
下一篇 2017-09-20 17:49

相关推荐

  • linux获取”命令帮助“

    一、相关术语:         外部命令:一个可执行程序,位于文件系统某目录下;是系统为了完善各种功能而加入的程序。         内部命令:系统shell程序的部分程序。内部命令执行速度非常快,其…

    Linux干货 2016-06-09
  • 计算机网络基础

    计算机网络 指使用一定的通信线路,把地理位置上相对分散的、具有独立自制能力的计算机系统等连接起来,在一定通信协议的约束与控制下,实现数据交换的目的! 计算机网络体系结构 计算机网络体系结构是一个分层次的模块式结构,每一层完成一个功能,这种流式化的结构能提高生产力!网络分层的好处 促进了标准化 各层次相互独立,技术升级和扩展灵活性好 便于方案的设计 开放系统互…

    Linux干货 2016-09-06
  • Linux文件系统

    1、Linux文件系统层级标准 为什么Linux的不同发行版中的目录结构基本上都一样? Linux有一个组织叫LSB定义的Linux发行版基础目录名称命名法则及功用规定,这种标准叫做 FHS(Filesystem Hierarchy Standard),文件系统层级标准。 /boot:系统引导启动时要加载的静态文件:kernel, initramfs(ini…

    Linux干货 2016-10-29
  • shell脚本编程之if条件判断与for、while、until循环

    一、if语句 语法: if 测试条件1 ; then        分支1 elif  测试条件2; then        分支2 … else&nbsp…

    Linux干货 2015-08-24
  • 关于大型网站技术演进的思考(十二)–网站静态化处理—缓存(4)

    原文出处: 夏天的森林   上篇我补充了下SSI的知识,SSI是一个十分常见的技术,记得多年前我看到很多门户网站页面的后缀是.shtml,那么这就说明很多门户网站都曾经使用过SSI技术,其实现在搜狐网站也还在用shtml,如下图所示: 由此可见SSI在互联网的应用还是非常广泛的。其实互联网很多网页如果我们按照动静分离策略拆分,绝…

    2015-03-11
  • CentOS 7 tomcat 7.0.54 的功能实现及详解

    一、 jdk 安装配置 # yum install java-1.8.0-openjdk-devel (依赖的java-1.8.0-openjdk,java-1.8.0-openjdk,headless也会被安装 ) # alternatives -h # vim /e…

    Linux干货 2014-06-09