大有可为的“正则表达式”(二)
5.3. 基本和扩展正则表达式
Unix支持两种的正则表达式的版本:
(1)现代版本:扩展正则表达式(extended regular expression,ERE),属于IEEE1003.2标准,拥有比BRE更多的功能。
(2)废弃版本:基本正则表达式(basic regular expression,BRE),它是多年以前使用的更原始类型的正则表达式,功能弱且语法容易混淆,后来被1003.2标准取代,保留它们只是为了与旧程序兼容。
ERE和BRE之间的主要区别:对于BRE来说,有一些特定的元字符不能使用,而其他元字符必须使用反斜线引用。不能使用的元字符有问号、加号和竖线
? + |
必须转义的元字符有花括号和圆括号
{ } ( )
基本正则表达式的限制:
Ø 花括号必须使用反斜线引用,如\{\}
Ø 圆括号必须使用反斜线引用,如\(\)
Ø 不能使用?,但是可以使用\{0,1\}模拟
Ø 不能使用+,但是可以使用\{1,\}模拟
Ø 不能使用|(竖线)
Ø 不能使用预字义字符类
5.4. 正则表达式的基本规则
1. 所有的普通字符,例如字母和数字都与自身匹配,如shell匹配于shell;WoRd匹配于WoRd,但不匹配于word
2. 当我们需要表示meta字符本身时,可以转义它,即前面放一个反斜杠。例如
\* 匹配字面上的*
\\ 匹配字面上的\
3. 在方括号表达式中,所有其他的的meta字符都会失去其特殊含义,例如
[ .\*]匹配于句点、反斜杠及星号。
4. 为了扩展正则表达式的功能,可以使用锚指定查找模式的位置。如$元字符是一个匹配行末尾的锚。为了搜索以“xiao“结尾的行,可以使用:
grep ‘xiao$’ data
通过使用这^ $这两个锚,但是两个锚之间不指定任何内容何以方便地查找空行。
grep ‘^$ ’ data | wc -l
匹配包含一个字符的行
grep ‘^.$’ data
注意:^与$仅在BRE的起始与结尾下有特殊用途。
查找所有包含字符串”kn”的行,但是字符串kn只能出现在单词的开头
grep ‘\<kn’ data
为了搜索完整的单词,可吧同时使用\<和\>
grep ‘\<word\> data
为了方便起见,在使用GNU实用工具的系统上,如Linux和FreeBSD系统,可以使用\b(boundary marker ,边界标记)作为\<和\>的替代,
grep ‘\<word\> data = grep ‘\bword\b’ data
5.5. ERE运算符的优先级
以下由高至低列出了ERE运算符的优先级:
运算符 | 含义 |
[ . . ] [ = =] [ : : ] | 用于字符对应的方括号符号 |
\metacharacter | 转义的元字符 |
[ ] | 方括号表达式 |
( ) | 分组 |
+ * ? { } | 重复前置的正则表达式 |
无符号(no symbol) | 连续字符 |
^ $ | 锚点 |
| | 交替 |
5.6. 额外的正则表达式运算符
运算符 | 含义 |
\w | 匹配任何单词组成字符,等同于[[:alnum:]] |
\W | 匹配任何非单词组成字符,等同于[^[:alnum:]] |
\< \> | 匹配单词的起始与结尾 |
\b | 匹配单词的起始或结尾处所找到的空字符串。注意:由于awk使用\b表示后退字符,因此GNU awk(gawk)使用\y表示此功能 |
\B | 匹配两个单词组成字符之间的空字符串 |
|
|
5.6. 匹配字符:字符类
在正则表达式中,元字符.(点号)匹配任何单个的字符,新行字符除外(在Unix中,新行字符标记一行的末尾)
例:grep ‘xiao..y’ data
在data文件中查找所有包含下述模式的行:字符串xiao后跟两个任意字符,再后跟一个字母y
字符类:将字符放在方括号[]中指定希望搜索的字符。这样的结构就称为一个字符类。
grep ‘\\\*.*[A-Za-z]+\$’ data
查找所有包含字符“\*”,后面跟任意数量的字符,再后跟1 个或多个字母,最后跟一个“$”的行。
怎样理解复杂的正规表达式
当遇到难以理解的正则表达式时,将它写在一张纸上,然后将正则表达式分成不同部分,纵向书写不同部分,一个在另一个之上。依次取不同部分,并将各部分的含义写在同一行上。
我们将这个正则表达式分隔成:
\\ _____ 1个\(反斜线)字符
\* —— 1个*(星号)字符
.* ____ 任意数量的其他字符
[A-Za-z] ____ 1 个或多个大写字母或小写字母
\$ ____ 1个$(美元)字符
5.7. 正规表达式案例
示范文件:Linux中的字典文件/usr/share/dict/words
(1)哪些英语单词以“qu”开头并以y结尾呢?
grep ‘^yu[a-z]+y$’ /usr/share/dict/words
grep '^qu.*y$' /usr/share/dict/words^ 行的开头
egrep '^yu[a-z]+y$' /usr/share/dict/words
qu 字符串qu
[a-z]+ 1个或多个小写字母
y 字母y
$ 行的结尾
(2)查找一个包含所有5个元间字母a、e、i、o、u(并且以该顺序出现)的普通英语单词。
这5个字母不必连在一起,但是它们必须按字母表顺序出现
grep 'a[a-z]*e[a-z]*i[a-z]*o[a-z]*u' /usr/share/dict/words
(3)在/bin目录中查找包含两个字母长的命令
ls /bin | egrep '^[a-z]{2}$'
ls /bin | grep '^[a-z][a-z]$'
注:在一些系统上,grep并不会返回预想的结果,因为它不能将括号识别为花括号元字符,如果出现这种情况,可以使用egrep 代替grep
转载于:https://blog.51cto.com/xiaofeixia/672505
相关文章:

【AI】caffe使用步骤(四):训练和预测
一、训练 1、直接训练 ./build/tools/caffe train --solverexamples/mnist/lenet_solver.prototxt ./build/tools/caffe train --solverexamples/mnist/lenet_solver.prototxt -gpu all //使用全部的gpu来训练2、采用微调funing-tuning训练法 ./build/tools/caffe train --s…

Github免费中文书《Go入门指南》,带你从零学Go | 极客头条
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑作者 | 无闻整理 | Jane出品 | AI科技大本营(ID:rgznai100)【导语】Go(也称 Golang)是 Google 开发的一种静态强类型、编…

sql语句中having的作用是?
HAVING对由sum或其它集合函数运算结果的输出进行限制。比如,我们可能只希望看到Store_Information数据表中销售总额超过1500美圆的商店的信息,这时我们就需要使用HAVING从句。语法格式为: SELECT "column_name1", SUM("column…

微软重新释出MS10-015 解决蓝屏问题
微软于周二(3/2)重新释出MS10-015修补程序。由于先前使用者安装该程序时,若电脑中含有Alureon rootkit就会出现更新错误,因而微软也提醒使用者先行杀毒,并避免安装后可能造成的蓝屏画面。 MS10-015是微软在今年2月用来…

share_ptr_c++11
C智能指针 shared_ptr shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std. std::shared_ptr<int> sp1 std::make_shared<int>(10);std::shared_ptr<std::string> sp2 std::…

【Python】ubuntu14安装pycaffe环境:python2.7及依赖库
1、问题描述 ubuntu14自带的python2.7版本是python2.7.5,安装pycaffe环境时,出现错误,提示版本低。在bing上搜索源码安装python2.7.16的步骤,后续使用时,又报错,缺少SLL模块: Cant connect to…

周志华、张潼亲自辅导AI课程,DeeCamp 2019正式启动
4 月 8 日,创新工场对外宣布 DeeCamp 2019 人工智能训练营正式启动。 据介绍,DeeCamp 2019 将于 7 月 15 日至 8 月 23 日在北京、上海、南京、广州四地同时举办。今年招生规模也将扩大,计划招收 600 名大学生,进行为期 5 周的理…

No.2 条件
2019独角兽企业重金招聘Python工程师标准>>> clojure中不仅有if 还有when 还有什么when-do when-first when-let 一堆 首先介绍if (defn if? [x](if (pos? x)x(- x))) 这事一个取绝对值的方法,方法名改了下,pos? 是判断是否为正数 参数只能为数字 能看明白吧…

如何用Python和BERT做中文文本二元分类?| 程序员硬核评测
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑作者 | 王树义来源 | 王树芝兰(ID:nkwangshuyi)兴奋去年, Google 的 BERT 模型一发布出来,我就很兴奋。因为我当时正在用 fast.ai 的…

【C++】Google Protocol Buffer(protobuf)详解(二)
代码走读:caffe中protobuf的详细使用过程 【一】proto文件,以caffe.proto中BlobShape为例 syntax "proto2"; //指明protobuf版本,默认是v2,其它版本:"proto3"package caffe; // 最终生成c代码…

Linux使用
软件操作 软件包管理 yum安装 yum install ...卸载 yum remove ...搜索 yum serach ...清理缓存 yum clean packages列出已安装 yum list软件包信息 yum info ...硬件资源信息 内存free -m 硬盘df -h 负载(w或top)w 12:53:49 up 2:33, 3 users, load ave…

通过进程ID获得该进程主窗口的句柄
一个进程可以拥有很多主窗口,也可以不拥有主窗口,所以这样的函数是不存在的,所幸的是,相反的函数是有的。所以我们可以调用EnumWindows来判断所有的窗口是否属于这个进程。 typedef struct tagWNDINFO{ DWORD dwProcessId; …

【AI】caffe源码分析(一)
【一】caffe依赖开源库 【C】google gflags详解 【C】google glog详解 【C】Google Protocol Buffer(protobuf)详解(一) 【C】Google Protocol Buffer(protobuf)详解(二) 【C】goog…

专访博世王红星:大数据和AI将是中国制造业升级新动力
数据分析挖掘与工业大数据是智能制造与工业互联网的核心,其本质是通过促进数据的自动流动与智能决策去解决控制和业务问题,有效减少决策过程所带来的不确定性,并尽量克服人工决策的缺点,从而推动智能制造进程与智能工厂的建设&…

C进阶 - 内存四驱模型
一.内存四驱模型 不知我们是否有读过 《深入理解 java 虚拟机》这本书,强烈推荐读一下。在 java 中我们将运行时数据,分为五个区域分别是:程序计数器,java 虚拟机栈,本地方法栈,java 堆,方法区。…

ATEN—第十章OSPF的高级配置(4)
实验使用的工具:小凡模拟器一、在路由器R1上,配置接口,启动ospf路由进程和rip,宣告网段,并配置路由重分发★☆R1☆★☆→Router>Router>enableRouter#config terminalRouter(config)#hostname R1-jinR1-jin(config)#interfa…

【ubuntu】ubuntu14.04、16.04、18.04 LTS版本支持时间
0、历史版本下载地址 http://old-releases.ubuntu.com/releases/ http://mirrors.163.com/ubuntu-releases/ 1、官网说明 https://wiki.ubuntu.com/Kernel/LTSEnablementStack 2、简要记录 如下图: 14.04.0(v3.13) 14.04.1(v3.13) 14.04.5(v4.4) LTS 支持至 20…

BERT拿下最佳长论文奖!NAACL 2019最佳论文奖公布
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑作者 | 刘静编辑 | 李尔客本文经授权转自公众号图灵Topia(ID:turingtopia)今日,自然语言处理顶会NAACL 2019最佳论文奖公布ÿ…

Git Bash修改默认路径
Git Bash默认安装在C:/user目录下,如果管理其他目录的代码库,需要切换目录。 修改Git Bash的默认路径,不需要每次切换了。 方法: 桌面Git Bash快捷方式,右键-->属性-->“快捷方式”标签 1,修改“起止…

NextGEN Gallery ~ 最强WordPress相册插件
博客照片很多?上传和管理图片太烦?想幻灯显示相册?在博客中任意插入动态图片效果?…… 你和我一样,需要NextGEN Gallery,最强WordPress相册插件! 其实网上可以搜到不少关于这个插件的介绍&#…

【经验】网络加速:pip
一、python pip下载加速 参考博客:让PIP源使用国内镜像,提升下载速度和安装成功率。 pip/anaconda修改镜像源,加快python模块安装速度 1、Linux下 修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐…

iframe 有那些缺
*iframe 会阻塞主页面的 Onload 事 *iframe 和主页面共享连接池,而浏览器对相同域的连接有限制(6-8前),所以会影响页面的并行加 使用 iframe 之前需要考虑这两个缺点。如果需要使用 iframe,最通过 javascrit 动态给 iframe 添加 src 属性值&a…

用Python让蔡徐坤在我的命令行里打篮球!|附完整代码
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑来源 | 01二进制(ID:gh_d1999add1857)编辑 | Jane【导语】作者自称是一个经常逛 B 站的肥宅。最近 B 站上流行的视频素材除了“换脸”,其次就要属…

javascript 操作Word和Excel的实现代码
1.保存html页面到word 复制代码 代码如下:<HTML> <HEAD> <title> </title> </HEAD> <body> <form id"form"> <table id "PrintA" width"100%" border"1" cellspacing"0" cel…

【C++】C++11新增关键字详解
目录一、auto1、auto 用来声明自动变量,表明变量存储在栈(C11之前)2、auto用于推断变量类型示例(C11)3、声明或定义函数时作为函数返回值的占位符,此时需要与关键字 decltype 一起使用。(C11&am…

linux批量创建用户和密码
老男孩教育第五关实战考试题:批量创建10个用户stu01-stu10,并且设置随机8位密码,要求不能用shell的循环(例如:for,while等),只能用linux命令及管道实现。 方法1:[rootoldboy /]# ech…

“重构”黑洞:26岁MIT研究生的新算法 | 人物志
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑整理 | 若名出品 | AI科技大本营(ID:rgznai100)这是一个重要时刻。除了发布跟丈夫的两张合照外,Katie Bouman 在 Facebook 上鲜有内容更新&#…

【Ubuntu】VirtualBox显卡驱动VBoxVGA、VBoxSVGA、VMSVGA +3D对播放视频的影响
一、VBOXVGA、VMSVGA、VBOXSVGA简述 VBOXVGA和VBOXSVGA是vbox自己的,SVGA比VGA先进一点, VBoxSVGA: 使用Linux或者 Windows 7或者更高版本的新vm的默认图形控制器。 与传统的VBoxVGA选项相比,此图形控制器可提高性能和3D支持。 VBoxVGA: 将这…

MFC中利用CFileDialog选择文件并读取文件所遇到的问题和解决方法
在用MFC编写一个上位机时,需要实现选择和读取一个二进制文件,本来以为很简单的但是在实现过程中遇到很多问题,所幸都一一解决,这里做一下记录。 首先在实现文件选择,在界面上设置一个按钮,并在点击事件函数…

百度智能云一口气发布 14 个新产品,三大视频解决方案,产品最高降价 50%
产业智能化的浪潮正在加速传统互联网行业的升级,视频行业将成为最大的受益者。4 月 11 日,在 2019ABC INSPIRE 百度云智峰会上,百度副总裁、百度智能云总经理尹世明宣布,“百度云” 品牌全面升级为 “百度智能云”,以 …