Linux系统学习之正则表达式
一、基础的正则表达式
1."."(一个点)符号
点符号用于U匹配除换行符号之外的任意一个字符。例如:r.t可以匹配rot、rut,但是不能匹配root,但如果使用r..t,就可以匹配root、ruut、r t(中间是两个空格)等。
2.“*”符号
"*"号用于匹配前一个字符0次或任意多次,比如ab*,可以匹配a、ab、abb等。"*"号经常和"."符号加在一起使用。比如".*"代表任意长度的不包含换行的字符。
3.“{n,m\}"符号
虽然"*"可用于重复匹配前一个字符,但却不能精确地控制匹配的重复次数,使用"\{n,m\}"符号则能更加灵活地控制字符的重复次数,典型的有以下三种形式:
\{n\} 匹配前面的字符n次。下列匹配的是包含root的行(r和t中包含两个o)
[root@Cfhost-170820-UCNK ~]# grep 'ro\{2\}t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
\{n,\}匹配前面的字符至少n次以上(含n次)
[root@Cfhost-170820-UCNK ~]# grep 'ro\{0,\}t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
\{n,m\}匹配前面的字符n到m次
4."^"这个符号位于数字键盘6的上面,又称尖角号。这个符号用于匹配开头的字符。比如说"^root" 匹配的是以字母root开始的行
[root@Cfhost-170820-UCNK ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
5.“$"符号
和上面的尖角号相对,“$"用于匹配尾部,比如说"abc$"代表的是以abc结尾的行。如果是"^$"则代表该行为空,因为^和$间什么都没有。下例匹配的是以r开头,中间有一串任意字符,以h结尾
[root@Cfhost-170820-UCNK ~]# grep '^r.*h$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
6."[]"符号
这是一对方括号,用于匹配方括号出现的任一字符。比如说单选题的答案,可能是ABCD选项中的任意一个,正则表达式表示的就是[ABCD].如果遇到比较大范围的匹配,比如说要匹配任意一个大写字符,就需要使用"-"号做范围限定,写成[A-Z],要匹配所有字母则写成[A-Za-z].一定要注意,这里的”-“的作用不是充当一个字符。
如果是要匹配不是大写字母A、B、C、D的字符又该怎么写?还记得上面的"^"号吗?如果这个符号出现在[]中,则代表取反,也就是不是的意思。那这里的写法就是[^A-D],事情变得有点复杂了。
这里举个例子,看如何匹配手机号。手机号是11位连续的数字,第一位一定是1,所有表示"^1";第二位有可能是3(移动)或8(联通),表示为"[38]";后面连续9个任意数字,表示为
"[0-9]\{9\}";所以整个表达式应该写为"^[38][0-9]\{9\}"
7."\"符号|
假设有一个固定电话号码021-88888888,当然也可以写成 021 88888888(区号和电话号码之间用空格隔开),它们的不同之处就是区号和电话号码之间使用的符号不同,一个是
“-”,一个是空格。那么,对于这个电话号码要怎么匹配呢?很容易地想起应该使用"[]"来匹配。但是这么写:[-]是不对的,因为"-"放到"[]"中有特别含义。为了表示其作为一个字符的本意,就要使用"\"符了,这个符号代表转义字符,我们可以对很多特殊的字符进行“转义”,让它只代表字符本身,因此这里的写法就是[\ \-].
再举个例子,之前我们了解到".*"代表的是任意长度的不包括换行的重复字符。但是如果想要匹配任意长度的点号呢?这时我们用转义字符就对了:“\.*"。如果想要对”\"符号进行转义,就可以这样写:“\\"。
8."\<"符号和"\>"符号
这两个符号分别用于界定单词的左边界和右边界。birushuo"\<hello"用于匹配以”helo"开头的单词;而"hell\>"则用于匹配以"hello"结尾的单词。还可以2使用它们的组合“\<\>"用于精确匹配一个字符串。所以”\<hello\>"可精确匹配单词"hello",而不是helloworld等。如下所示:
[root@Cfhost-170820-UCNK ~]# echo "hello" | grep '\<hello\>'
hello
[root@Cfhost-170820-UCNK ~]# echo "hellod" | grep '\<hello\>'
#//没有输出,表示匹配不成功
9.”\d"符号
匹配一个数字,等价于[0-9],使用grep匹配这种正则表达式时,可能会遇到无法匹配的问题,示例如下:
[root@Cfhost-170820-UCNK ~]# echo 123 | grep [0-9]
123
[root@Cfhost-170820-UCNK ~]# echo 123 | grep '\d'
#没有输出,表示匹配不成功,为什么呢?
#这是因为"\d"是一种Per1兼容模式的表达式,又称作PCRE,要想使用这种模式的匹配符,需要加上-P参数
[root@Cfhost-170820-UCNK ~]# echo 123 | grep -P '\d'
123
10.“b"符号
匹配单词的边界,比如"\bhello\b"可精确匹配"hello"单词
[root@Cfhost-170820-UCNK ~]# echo "hello world" |grep '\bhello\b'
hello world
[root@Cfhost-170820-UCNK ~]# echo "helloworld" |grep '\bhello\b'
#这里没有匹配
11."\B"符号
匹配非单词的边界,比如hello\B可以匹配"helloworld“中的"hello"
[root@Cfhost-170820-UCNK ~]# echo "helloworld" |grep 'hello\B'
helloworld
12."\w"符号
匹配字母、数字、下划线,等价于[A-Za-z0-9]
[root@Cfhost-170820-UCNK ~]# echo "a" | grep '\w'
a
[root@Cfhost-170820-UCNK ~]# echo "\\" | grep '\w'
14."\n"符号
匹配一个换行符
15.”\r"符号
匹配一个回车符
16."\t"符号
匹配一个制表符
17."\f"符号
匹配一个换页符
18."\s"符号
匹配任何空白字符
19."\S"符号
匹配任何非空白字符
二、扩展的正则表达式
“?”符号
"?"符号用于匹配前一个字符0次或1次,所以"ro?t"仅能匹配rot或rt
“+”符号
"+"符号用于匹配前一个字符1次以上,所以"ro+t"就可以匹配rot、root等
"|"符号
"|" 符号是"或"的意思,即多种可能的罗列,彼此间是一种分支关系。比如说有些地区固定电话的区号是4位数,有些地方却是3位数,这样针对不同的区号就有不同的固定电话的表示如:
#区号是3位的固定电话的正则表达式方式
^0[0-9]\{2\}-[0-9]\{8\}
#区号是4位的固定电话的正则表达式方式
^0[0-9]\{3\}-[0-9]\{8\}
#两种区号的固定电话号码可以如下写:
^0[0-9]\{2,3}-[0-9]\{8\}
#使用"|"符号业可以,但是显然比上面的方式麻烦
^0[0-9]\{2\}-[0-9]\{8\}|^0[0-9]\{3\}-[0-9]\{8\}
#"()"符号
"()符号通常需要和"|"符号联合使用,用于枚举一系列可替换的字符。比如说固定电话的区号和电话号码之间,可能用"-"符号或者用一个空格连接,用于匹配的正则表达式如下:
^0[0-9]\{2,3\}(-1)[0-9]\{8\}
^0[0-9]\{2,3\}[\ \-] [0-9]\{8\}
虽然以上两种写法没有本质的不同,因为"()"和"|"可以和"[]"相互混用,但是在某些场景下,"()"和"|"可以做的更多,比如说像hard、hold或hood等这类开头和结尾的字母都一样的单词,要匹配这些就必须使用"()"和"|"了。如下所示:
h(ar|oo|ol)d
三、通配符
实际上,通配符是一种特殊的语句·1,主要包含"*"号和"?"号(还有"{}"、“^"、”!“)。主要用来模糊搜索文件,使用它来代替一个或多个真正的字符,尤其是在不知道或者不确定完整的文件名时,用来匹配符合条件的文件。
”*“符号:
这里的*就是提到的第一个通配符,代表0个或多个字符。
”?“符号
如果要列出以字母A开头、但是只有两个字母的文件名、以.doc结尾的文件,就需要使用"?"了。当它作为通配符使用时,代表的是任意一个字符。
”{}"符号:
"{}"可拥有匹配所有括号内包含的以逗号隔开的字符。
Linux系统学习之正则表达式的更多相关文章
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
- Linux 系统学习梳理_【All】
第一部分---基础学习 00.Linux操作系统各版本ISO镜像下载 00.Linux系统下安装Vmware(虚拟机) 00.Linux 系统安装[Redhat] 00.Linux 系统安装[Cent ...
- Linux系统学习优缺点
Linux是一套操作系统,按照鸟哥的说法Linux提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构,这个架构是沿袭Unix良好的传统而来的,功能强大而且稳定性卓越.其实Torvalds ...
- 网工的Linux系统学习历程
偶遇篇作为一名通过思科CCNP认证的网络工程师,专注于网络技术.但在日常的工作中,难免不接触到服务器,对于大多数服务器来说,鉴于稳定性等因素的考虑,基本使用的都是Linux系统,包括RHEL.Cent ...
- 谈谈我对Linux系统学习的历程回顾
众所周知,Windows 和Linux 是目前最流行的2个操作系统.Windows系统适合普通用户,它的优势是图形化界面,简单易用,使用起来门槛很低,很容易上手,所以,windows占有了大多数普 ...
- 老司机浅谈linux系统学习技巧
Linux起源于20世纪70年代,是一种优秀的操作系统系统.初次接触到linux这个系统是在大学期间,这样才发现除了windows外的另外一个有趣系统.开始抱着好奇的心态去了解,随着深入学习,笔者被它 ...
- 说一说本人对linux系统学习的方法和经验
摘要: 相信大伙都听说过linux系统,然而对于这个系统,总使让新手感觉茫然,诺达的系统.下面是一段百度中的介绍: 相信大伙都听说过linux系统,然而对于这个系统,总使让新手感觉茫然,诺达的系统.下 ...
- Linux系统学习笔记(1)
学习地址:http://www.runoob.com/linux/linux-tutorial.html 1.学习Windows和Linux哪个比较难? 前期是Windows容易学习,后期是Linux ...
- Linux系统学习之 一:新手必须掌握的Linux命令1
2018-10-03 16:04:12 一.常用系统工作命令 1.wget 命令 作用:用于在终端中下载网络文件. 格式:wget [参数] 下载地址 参数及作用: -b : 后台下载模式 -d:显示 ...
随机推荐
- Visual Studio 代码风格约束
团队内部若能统一代码风格对于日后的项目维护大有裨益,但面对厚达十几甚至几十页的代码风格规范,开发人员难免产生抵触心理.Python和Go等在语言层面就对代码风格作了一定的约束,但C#并没有,为解决这个 ...
- 数据机构-折半查找法(二分查找法)-Python实现
Python实现二分查找法(基于顺序表) class List: elem=[] #存储顺序表元素 last=-1 #设置初始为-1 SeqList = List() #创建一个顺序表 print(& ...
- Docker 搭建 ELK 收集并展示 tomcat 日志
架构 前端展示 --> 索引搜索 <-- 日志提取及过滤 --> 日志缓存 <-- 日志收集 Kibana --> Elastash <-- Logstash -- ...
- 自定义基于jquery竖向瀑布流插件
公司新项目做了一个关于图片的板块,网上找了一些瀑布流插件都不是很适合自己,于是就自己造轮子写一个,并封装成插件github 于是就想分享一下,主要是为了更好的学习与记忆. 如果大家进来了,希望能给我g ...
- Ubuntu 16.04 LTS 下安装 ibus-rime 输入法
搜 Linux 下粤拼输入法的时候发现了 Rime,由于 fcitx 下的拼音输入体验实在不太好(搜狗是在我的电脑上完全坏掉了,调不出来,配置文件的问题一直没解决:谷歌是好过没有),于是安装 ibus ...
- 程序员Web面试之jQuery
又到了一年一度的毕业季了,青春散场,却等待下一场开幕. 在求职大军中,IT行业的程序员.码农是工科类大学生的热门选择之一, 尤其是近几年Web的如火如荼,更是吸引了成千上万的程序员投身其中追求自己的梦 ...
- Android深入四大组件(七)Service的绑定过程
前言 我们可以通过调用Context的startService来启动Service,也可以通过Context的bindService来绑定Service,建议阅读此篇文章前请阅读Android深入四大 ...
- Asp.Net Core 使用Quartz基于界面画接口管理做定时任务
今天抽出一点点时间来造一个小轮子,是关于定时任务这块的. 这篇文章主要从一下几点介绍: 创建数据库管理表 创建web项目 引入quarzt nuget 包 写具体配置操作,实现定时任务处理 第一步:创 ...
- selenium元素定位(Java)
1.使用findElement方法定位元素 findElement()方法:当开始寻找符合指定条件的元素时,它将查询整个DOM,然后返回第一个找到的匹配元素. By id:通过元素ID属性定位 ...
- 对JavaScript中闭包的理解
在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容.之前我对闭包的理解主要是"通过闭包可以在函数外部能访问到函数内部的变量",对闭包运用的也很少,甚至自己写过闭包自己 ...