编程常用的正则(十分钟快速入门)

编程常用的正则(十分钟快速入门)(1)

什么是正则表达式

正则表达式是一种工具,和其他工具一样,它是人们为了解决特定的问题而发明的,主要有两种用途:

  • 一种是查找特定的信息(搜索)
  • 另一种是查找并编辑特定的信息(替换)

它是文本处理方面功能最强大的工具之一。

正则表达式表现形式

正则表达式通常是一些由文本和特殊指令构成的高度简练的字符串,比如下面这几个,它们都是合法的正则表达式(后面会解释它们的用途):

Ben . www\.forta\.com [a-zA-Z0-9_.]* <[Hh]1>.*</[Hh]1> \r\n\r\n \d{3,3}-\d{3,3}-\d{4,4}

正则表达式实现原理

正则表达式是用正则表达式语言创建的,与其他程序设计语言一样,正则表达式语言也有必须要学习的特殊语法和指令,这正是本文要教给大家的东西,下面我们一起来实践一下吧。

正则表达式语言并不是一种完备的程序设计语言,它甚至算不上是一种能够直接安装并运行的程序或实用工具。更准确地说,正则表达式语言是内置于其他语言或软件产品里的“迷你”语言。好在现在几乎所有的语言或工具都支持正则表达式。

一、匹配单个字符

1.匹配纯文本

Ben 是一个正则表达式。因为本身是普通文本(plain text),所以看起来可能不像是一个正则表达式,但它的确是。正则表达式可以包含普通文本(甚至可以只包含普通文本)。当然,这种正则表达式纯粹就是一种浪费,但把它作为我们学习正则表达式的起点还是很不错的。

来看一个例子:

编程常用的正则(十分钟快速入门)(2)

分析

这里使用的是普通文本正则表达式,它将匹配原始文本里的Ben。

正则表达式是区分字母大小写的,所以Ben 不匹配ben。不过,绝大多数正则表达式的实现也支持不区分字母大小写的匹配操作。比如说,JavaScript 用户可以用i 标志来强制执行不区分字母大小写的搜索。

再来看一个例子,它使用了与刚才相同的原始文本和另外一个正则表达式:

编程常用的正则(十分钟快速入门)(3)

分析

my 也是静态文本,它在原始文本里找到了两个匹配结果。

绝大多数正则表达式引擎的默认行为是只返回第一个匹配结果。具体到上面那个例子,原始文本里的第一个my 通常是一个匹配结果,但第二个往往不是。

怎样才能把两个或更多个匹配结果都找出来呢?绝大多数正则表达式的实现都提供了一种能够获得所有匹配结果的机制(通常以数组或是其他的特殊格式形式返回)。比如说,在JavaScript 里,可选的g(global,全局)标志将返回一个包含所有匹配结果的数组。

2.匹配任意字符

前面见到的正则表达式匹配的都是静态文本,根本体现不出正则表达式的威力。下面,我们一起来看看如何使用正则表达式去匹配不可预知的字符。

在正则表达式里,特殊字符(或字符集合)用来标示要搜索的东西。.字符(英文句号)可以匹配任意单个字符。

提示:在绝大多数的正则表达式实现里,.就不能匹配换行符。

于是,正则表达式c.t 可以匹配到cat 和cot(还有一些毫无意义的单词)。

来看一个例子:

编程常用的正则(十分钟快速入门)(4)

编程常用的正则(十分钟快速入门)(5)

分析

正则表达式sales.可以找出所有以字符串sales 起始,后跟另外一个字符的文件名。9 个文件里有3 个与该模式(pattern)匹配。

提示:人们常用术语模式表示实际的正则表达式。

.字符可以匹配任意单个字符、字母、数字甚至是 .字符本身:

编程常用的正则(十分钟快速入门)(6)

分析

这个例子比上一个多了一个sales.xls 文件。因为.能够匹配任意单个字符,所以模式sales.也匹配该文件。

在同一个正则表达式里允许使用多个.字符,它们既可以共同出现(一个接着一个——..将匹配连续的任意两个字符),也可以分别出现在模式的不同位置。

我们再来看一个使用了相同原始文本的例子:把以na(North America)或sa(South America)开头的文件(不管它们后面跟着什么数字)找出来。

编程常用的正则(十分钟快速入门)(7)

分析

正则表达式.a.把na1、na2 和sa1 找了出来,但它同时还找到了4个预料之外的匹配结果。为什么会这样?因为只要有任意3 个字符且中间那个字符是a,该模式就能够匹配。

我们真正需要的是后面再紧跟着一个英文句号的.a.的模式。再来试一次:

编程常用的正则(十分钟快速入门)(8)

分析

.a..并不比.a.好多少,新增加的.将匹配任何一个多出来的字符(不管它是什么)。既然.是一个能够与任意单个字符相匹配的特殊字符,怎样才能搜索.本身呢?

.字符在正则表达式里有着特殊的含义。如果模式里需要一个.,就要想办法来告诉正则表达式你需要的是.字符本身而不是它在正则表达式里的特殊含义。为此,你必须在.的前面加上一个\(反斜杠)字符来对它进行转义。\是一个元字符(metacharacter,表示“这个字符有特殊含义,代表的不是字符本身”)。因此,.表示匹配任意单个字符,\.表示匹配.字符本身。

再来验证一次刚才的例子,这次我们使用了\对.进行转义:

编程常用的正则(十分钟快速入门)(9)

分析

.a.\.解决了问题。第一个.匹配n(在前两个匹配结果里)或s(在第三个匹配结果里),第二个.匹配1(在第一个和第三个匹配结果里)或2(在第二个匹配结果里)。接下来,\.匹配了分隔文件名与扩展名的字符.本身。

这个例子可以进一步改进:在模式中加入xls,避免匹配到像sa3.doc这样的文件名,就像下面这样:

编程常用的正则(十分钟快速入门)(10)

在正则表达式里,\字符总是出现在具有特殊含义字符序列的开头,这个序列可以由一个或多个字符构成。

注意:如果需要搜索\本身,就必须对\字符进行转义。相应的转义序列是两个连续的反斜杠字符\\。

小结

正则表达式,也被称为模式,其实是一些由字符构成的字符串。这些字符可以是字面字符(普通文本)或元字符(有特殊含义的字符)。本文,我们介绍了如何使用普通文本和元字符去匹配单个字符。.可以匹配任意单个字符。\用来对字符进行转义。在正则表达式里,有特殊含义的字符序列总是以\字符开头。

——

本文删减自《正则表达式必知必会(修订版)》,豆瓣评分9.2

编程常用的正则(十分钟快速入门)(11)

书总共一百多页,短小精悍,实例 说明,是全球程序员公认的正则表达式最佳速成教材。它精选了正则表达式中最常用,最重要的知识,从简单的文本匹配开始,通过简明又实用的示例,循序渐进的介绍更高级的内容。

目录

第1章 正则表达式入门

第2章 匹配单个字符

第3章 匹配一组字符

第4章 使用元字符

第5章 重复匹配

第6章 位置匹配

第7章 使用子表达式

第8章 反向引用

第9章 环视

第10章 嵌入式条件

第11章 常见问题的正则表达式解决方案

附录 A 常见应用软件和编程语言中的正则表达式

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页