解决实际问题

04-13Ctrl+D 收藏本站

关灯 直达底部

Solving Real Problems

掌握正则表达式,可能带来超乎你之前想象的文本处理能力。每一天,我都依靠正则表达式解决各种大大小小的问题(通常的情况是,问题本身并不复杂,但没有正则表达式就成了大问题)。

要说明正则表达式的价值,可以举一个用正则表达式解决大而重要的问题的例子,但是它不一定能代表正则表达式在平时解决的那些“不值一提”(uninteresting)的问题。这里的“不值一提”是指这类问题并不能成为谈资,可是不解决它们,你就没法继续干活。

举个简单的例子,我需要检查许多文件(事实上,本书的手稿存放在 70 个文件中),确保每一行中‘SetSize’出现的次数与‘ResetSize’的一样多。为了应付复杂的情况,我还需要考虑大小写的情况(举例来说,‘setSIZE’也算做‘SetSize’)。人工检查 32 000 行文字显然不现实。

即便使用文本编辑器的“单词查找”功能,也不够方便,尤其是对所有文件进行同样的操作,何况还需要考虑所有可能的大小写情况。

正则表达式就是解决这个问题的灵丹妙药。只需要一个简单的命令,我就能够检查所有的文件,获得我需要知道的结果。时间是:写命令大概15秒,检索所有的数据实际只花了2秒。这真是棒极了(如果您想知道这是怎么做到的,不妨现在就翻到第36页)!

再举一个例子,我曾帮助一个朋友处理远端机器上的某些 E-mail,他希望我把他邮箱文件中的消息作为列表发送给他。我可以把整个文件导入文本编辑器,手工删除所有信息,只留下邮件头中的几行,作为内容的列表。尽管文件不是很大,连接速度也不算慢,这样的任务还是很耗费时间而且很乏味。而且,窥见他的邮件正文,也令我尴尬。

正则表达式再一次提供了帮助!我用一个简单的命令(使用本章稍后提到的一个常用工具egrep)显示每封邮件的From:和Subject:字段。为了告诉egrep我需要提取哪些行,我使用了正则表达式「^(From|Sbuject):」。

朋友得到这个列表之后,让我找一封特殊的(5 000 行!)邮件。使用文本编辑器或者邮件系统来提取一封邮件无疑非常耗时。相反,我借助另一个工具(叫做 sed),同样使用正则表达式来描述文件中我需要的内容。这样,我能迅速而方便地提取和发送需要的邮件。

使用正则表达式节省下来的时间或许并不能让人“激动”,但总比把时间消耗在文本编辑器中要好。如果我不知道有正则表达式这种玩意儿,根本就不会想到还有别的解决办法。所以,这个故事告诉我们,正则表达式和相关的工具能够让我们以可能未曾想过的方式来解决问题。

一旦掌握了正则表达式,你就会知道到它简直是工具中的无价之宝,你也难以想象之前那些没有正则表达式的日子是怎么度过的(注1)。

全面掌握正则表达式是很有用的。本书提供了掌握这种技能所需要的信息,我同时也希望,这本书也提供了促使你学习的动机。