接下来的Regular Expression(RE) 可是个大题目,要讲的很多。 我这里当然不可能讲得很全。 只希望能带给大家一个基本的入门概念,就很足够了...
先来考一下英文好了:What is expression? 简单来说,就是"表达",也就是人们在沟通的时候所要陈述的内容。
然而,生活中,表达方要清楚的将意思描述清楚, 而让接收方完整无误地领会,可不是件容易的事情。
因而才会出现那么多的"误会", 真可叹句"表达不易"啊......
同样的情形也发生在计算机的数据处理过程中,
尤其是当我们在描述一段"文字内容"的时候....
那么,我们不禁要问:
有何方法可以让大家的误会降至最低程度,
而让表达的精确度达到最高程度呢?
答案就是"标准化"了,
也就是我们这里要谈的Regular Expression
啦...^_^
然而,在进入RE
介绍之前,不妨先让我们温习一下shell十三问之第4问,
那就是关于quoting的部分。
关键是要能够区分 shell command line上的meta与literal的这两种不同的字符类型。
然后,我这里也跟你讲: RE 表达式里字符也分meta与literal这两种。
呵,不知亲爱的读者是否被我搞混乱了呢?... ^_^
这也难怪啦,因为这的确是最容易混淆的地方,
刚学RE
的朋友很多时候,都死在这里!
因此,请特别小心理解哦...
简单而言,除非你将RE
写在特定程序使用的脚本里,
否则,我们的RE
也是通过 command line输入的。
然而,
不少RE所使用的meta字符,跟shell 的meta字符是冲突的。
比方说, *``这个字符,在RE里是一个modifier(修饰符);而在command line上,确是wildcard(通配符)**。
那么,我们该如何解决这样的冲突呢? 关键就是看你对shell十三问的第4问中所提的quoting是否足够理解了!
若你明白到 shell quoting 就是用来在command line上关闭shell meta这一基本原理, 那你就能很轻松的解决 RE meta与shell meta的冲突问题了: 用shell quoting 关闭掉shell meta就是了。 就这么简单... ^_^
再以刚提到*
字符为例,
若在command line的path中没有quoting处理的话,
如abc* 就会被作为wildcard expression来扩充及重组了。
若将其置于quoting中,即"abc*",则可以避免wildcard expand的处理。
好了,说了大半天,还没有进入正式的RE介绍呢.... 大家别急,因为我的教学风格就是要先建立基础,循序渐进的... ^_^ 因此, 我这里还要再啰嗦一个观念,才会到RE的说明啦...(哈...别打我...)
当我们在谈到RE时,千万别跟wildcard搞混在一起! 尤其是
在command line的位置里,wildcard只作用于argument的path上;
而RE却只用于"字符串处理" 的程序中,这与路径名一点关系也没有。
Tips: RE 所处理的字符串,通常是指纯文本或通过stdin读进的内容。
okay,够了够了,我已看到一堆人开始出现不耐烦的样子了... ^_^ 现在,就让我们登堂入室,揭开RE的神秘面纱吧, 这样可以放过我了吧? 哈哈...
在RE的表达式里,主要分为两种字符:literal
与meta
。
所谓literal
就是在RE里不具有特殊功能的字符,如abc,123等;
而meta
,在RE里具有特殊的功能。
要关闭之,需要在meta
之前使用escape()转义字符。
然而,在介绍meta
之前,先让我们来认识一下字符组合(character set)会更好些。
一、所谓的char set就是将多个连续的字符作为一个集合。 例如:
char set | 意义 |
---|---|
abc | 表示abc三个连续的字符,但彼此独立而非集合。(可简单视为三个char set) |
(abc) | 表示abc这三个连续字符的集合。(可简单视为一个char set) |
abc|xyz | 表示abc或xyz这两个char set之一 |
[abc] | 表示单一字符,可为a或b或c;与wildcard的[abc]原理相同,称之为字符类。 |
[^abc] | 表示单一字符,不为a或b或c即可。(与wildcard [!abc]原理相同) |
. | 表示任意单个字符,(与wildcard的?原理相同) |
note: abc|xyz 表示abc或xyz这两个char set之一
在认识了RE的char set这个概念之后,然后,在让我们多认识几个RE中常见的meta字符:
二、 锚点(anchor): 用以标识RE在句子中的位置所在。 常见的有:
锚点 | 说明 |
---|---|
^ | 表示句首。如,^abc表示以abc开头的句子。 |
$ | 表示句尾。如,abc$表示以abc结尾的句子。 |
\< | 表示词首。如,\<abc表示以abc开头的词。 |
\> | 表示词尾。如,abc\>表示以abc结尾的词。 |
三、 修饰符(modifier):独立表示时本身不具意义,专门用以修饰前一个char set出现的次数。 常见的有:
modifier | 说明 |
---|---|
* | 表示前一个char set出现0次或多次,即任意次。如ab*c表示a与c之间可以有0个或多个b。 |
? | 表示前一个char set出现0次或1次,即至多出现1次。如ab?c 表示a与c之间可以有0个或1个b。 |
+ | 表示前一个char set出现1次或多次,即至少出现1次。如ab+c 表示a与c之间可以有1个或多个b。 |
{n} | 表示前一个char set出现n次。如ab{n}c 表示a与c之间可以有n个b。 |
{n, } | 表示前一个char set至少出现n次。如ab{n}c 表示a与c之间至少有n个b。 |
{n, m} | 表示前一个char set至少出现n次,至多出现m次。如ab{n,m}c 表示a与c之间至少有n个b,至多有m个b。 |
然而,当我们在识别modifier时,却很容易忽略"边界(boundary)字符"的重要性。
以ab{3,5}c
为例,这里的a与c就是边界字符了。
若没有边界字符的帮忙,我们很容易做出错误的解读。
比方说: 我们用ab{3,5}
这个RE(少了c这个边界字符)
可以抓到"abbbbbbbbbb"(a后面有10个b)的字符串吗?
从刚才的modifier的说明,我们一般认为,我们要的b是3到5个,
若超出了此范围,就不是我们所要表达的。
因此,我们或许会很轻率地认为这个RE抓不到结果(上述"abbbbbbbbbb"字符串)。
然而,答案却是可以的!为什么呢?
让我们重新解读ab{3,5}
这个RE看看:
我们要表达的是a后接3到5个b即可,但3到5个b后面,我们却没有规定什么,
因此,在RE后面可以是任意的字符串,当然包括b也可以啦!(明白了吗?)
同样,我们用b{3,5}c
也同样可以抓到"abbbbbbbbbbc"
这样的字符串。
但当我们用ab{3,5}c
这样的RE时,
由于同时有a与c这连个边界字符,就截然不同了!
有空在思考一下,为何我们用下面这些RE都抓到abc这样的字符串呢?
x*
ax*, abx*, ax*b
abcx*, abx*c, ax*bc
bx*c, bcx*, x*bc
但, 若我们在这些RE前后分别加^
与$
这样的anchor,那又如何呢?
刚学RE时,只要能掌握上面这些基本的meta的大概就可以入门了。 一如前述,RE是一种规范化的文字表达式, 主要用于某些文字处理工具之间,如: grep, perl, vi,awk,sed,等等, 常用于表示一段连续的字符串,查找和替换。
然而每种工具对RE表达式的具体解读或有一些细微差别, 不过节本原理还是一致的。 只要掌握RE的基本原理,那就一理通百理了, 只是在实践时,稍加变通即可。
比方以grep来说, 在Linux上,你可以找到grep,egrep,fgrep这些程序, 其差异大致如下:
grep: 传统的grep程序,在没有任何选项(options)的情况下,只输出符合RE字串的句子, 其常见的选项如下:
选项 (option) | 用途 |
---|---|
-v | 反模式, 只输出“不含”RE的字符串的行。 |
-r | 递归模式,可同时处理所有层级的子目录里的文件 |
-q | 静默模式,不输出任何结果(stderr 除外,常用于获取return value,符合为true,否则,为false. |
-i | 忽略大小写 |
-w | 整词匹配,类似 \<RE> |
-n | 同时输出行号 |
-l | 输出匹配RE的文件名 |
-o | 只输出匹配RE的字符串。(gnu新版独有,不见得所有版本支持) |
-E | 切换为egrep |
egrep:为grep的扩充版本,改良了许多传统grep不能或者不便的操作,
?
与+
这两种meta,但egrep支持;a|b
或(abc|xyz
)这类“或一”的匹配,但egrep支持;{n,m}
时,需要\{ 与 \}处理,但egrep不需。等诸如此类的。我个人建议能用egrep就不用grep啦...^_^
fgrep: 不作RE处理,表达式仅作一般的字符串处理,所有的meta均市区功能。
好了,关于RE的入门,我们暂时就介绍到这里。 虽然有点乱,且有些观念也不恨精确, 不过,姑且算是对大家的一个交差吧...^_^ 若这两天有时间的话,我在举些范例来分析一下,以帮助大家更好的理解。 假如更有可能的话,也顺道为大家介绍一下sed这个工具。
讲到command line的重组特性, 真的需要我们好好的加以解释的。
如此便能抽丝剥茧的一层层的将整个command line分析的 一清二楚,而不至于含糊。
假如这个重组的特性理解了,那我们介绍一个好玩的命令:eval
.
我们在变量替换的过程中,常会碰到所谓的复式变量的问题: 如:
a=1
A1=abc
我们都知道echo $A1
就可以得到abc的结果。
然而,我们能否用$A$a来取代$A1,而同一样替换为abc呢?
这个问题我们可用很轻松的用eval
来解决:
eval echo \$A$a
说穿了,eval
只不过是在命令行完成替换重组后,
在来一次替换重组罢了...
就是这么简单啦~~~ ^_^
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。