原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责
其实Linux系统中处理文本的工具还有很多,功能也远比我们所能想象到的任何工具都要强大。要想真正掌握它们,就必须要掌握一项基本技能——正则表达式。
正则表达式已经无处不在了,无论是网络文章,还是很多图书,亦或是教材也都在讲解正则表达式,我们也坚信正在读本书的你也早已熟稔正则表达式的运用。但是,我们依然要介绍它,只是换了一个角度,以期望初学者能有一个好的开端,行家里手们能够加深入的理解它,因为要熟练使用Linux是离不开正则表达式。
对于初学者来讲,一定会追问到底什么是正则表达式。这是一个很难回答的问题。但是我们可以通过一个应用实例来让大家明白。一般地,我们在处理字符串的时候后有需要判断是否存在某个子串的情况,比如要在字符串“prefix=/usr”中来判断是否拥有“prefix=”这个字串,可以使用逐一比对的方式来完成这个功能。这看起来很好,而且屡试不爽。还能进一步演进算法,实现提取诸如“prefix”的“值”这样的需求。显然只需要判断字符串中有“prefix=”这个子串并确认它的位置就能够提取出“/usr”这个子串了。看来变量取值算法也是很“简单”的啊!但是别骄傲,当你遇到“exec-prefix=/libexec prefix=/usr”这样的字符串时,你怎么取“prefix”的值呢?你会说,稍微变化一下算法就行了。那遇到的字符串更复杂怎么办?对于这类需求,我们可以变换一下思路,即找到“K=V”这样形式的子串会更好。或许现在你觉得思路又开阔了。但是别着急,还有更复杂的在等着你。比如字符串“3.1416 * 100 ^ 2”,要提取出所有数字。似乎你又有思路了,无外乎提取连续的0至9,附带+、-号以及“.”的字串,但是这就能完成任务了?如果再变成“3.1416 * 1.3E2 ^ 2”这样了呢?反正变化很多。如果你要还是保持前面的思路,我保证你使用几十万行代码的if-else都满足不了需求。估计你现在一定会想,如果有一门语言只需要编写少量的代码就能够满足上面的所有需求的话,一定要学会它。这样你就不怕老板在这个地方的各种刁难。那我告诉你,还真有一门这样的语言,它就是——正则表达式。一些简单的正则表达式,就能够满足上面的这些需求,比如:
prefix=
[ \t]*[a-zA-Z]+=[ \t]*[a-zA-Z/]+[ \t]*
[+-]?[0-9]+(\.[0-9]*)?([Ee][+-]?[0-9]+)?
我们说上面的这些方方块块、花花草草就是正表达式了,它们具体都是什么含义呢?
为了搞清楚这个问题,我们首先要对正则表达式所要处理的文本进行一下精确定义。这个定义是:文本是指字符串的集合,其中的字符来自于一个有限的字符集合。也就是说,文本是由一个有限的字符集构成的,但是文本本身既可以是有穷集合,也可以是无穷集合。就比如属于文本的源代码文件,就是满足某种语言语法的全体字符串的集合,但是不同的源代码全部算在一起显然就是一个无穷的集合。当然,也可以有非常简单的文本,比如只含有一个字母“a”的文本,如果用集合了表示的话就是{a}。按照这个定义,正则表达式就是来描述任意文本的一种特殊表达式,而且拥有两个基本要素:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。