1.1 正则表达式的用途
无论是前端开发、后端开发、文档工程师、作家、UP 主,只要是需要和文本打交道的,都或多或少可以用到正则表达式。
无论是前端开发、后端开发、文档工程师、作家、UP 主,只要是需要和文本打交道的,都或多或少可以用到正则表达式。
正则表达式的应用场景非常多,在几乎所有常用的文本编辑器和程序语言中都可以使用正则表达式进行文本的搜索或替换。本节我们学习在几种常见的编辑器和编程语言中如何使用正则表达式。
我们已经知道了正则表达式的用途以及使用的方式和场景。那么到底什么是正则表达式?正则表达式是怎么来的呢?
正则表达式的使用方法和具体功能,在不同的应用程序、编程语言和工具里面各有不同。一般来说,应用程序大多数在搜索/替换输入框里面使用正则表达式,而编程语言在函数或类里面使用正则表达式。
我们先来看一下例子。
我们先来看一下例子。
正则表达式语法
上一节见到的正则表达式都是静态文本,它们根本体现不出正则表达式的威力。下面我们一起来看看如何使用正则表达式去匹配不可预知的字符。
我们已经知道了如何进行普通纯文本匹配和普通字符匹配,如果要匹配的字符就是正则语法特殊字符的一部分要怎么匹配呢?本节我们一块学习正则特殊字符的匹配。
第 2 章介绍的 . 字符可以匹配任意单个个字符。在第 2 章的一个例子里,我们使用了 .a 来匹配 na 和 sa。现在,如果在那份文件清单里增加了一个名为 cal.xls 的文件,而你仍只想找出 na 和 sa,你该怎么办?别忘了, . 也能匹配 c,所以文件名 cal.xls 也会被找出。
我们再来仔细看看那个从一份文件清单里找出特定文件的例子。我们刚才使用的模式 [ns]a.\.xls 还存在着另外一个问题。如果那份文件清单里有一个名为 sam.xls 的文件,结果会怎样?显然,因为 . 可以匹配所有的字符而不是仅限于数字,所以文件 sam. xls 也会出现在匹配结果里。这个问题可以用一个如下所示的字符集合来解決:
字符集合通常用来指定一组必须匹配其中之的字符。但在某些场合,我们需要反过来做,给出一组不需要得到的字符。换向话说,除了那个字符集合里的字符,其他字符都可以匹配。
在介绍其他元字符的用法之前,我们认为应该先把特殊字符的转义问题向大家解释清楚。
元字符大致可以分为两种:一种是用来匹配文本的(比如 . ),另一种是正则表达式的语法所要求的(比如 [ 和 ] )。随着学习的深入,你将发现越来越多的这两种元字符,而我们现在要介绍给大家的是一些用来匹配各种空白字符的元字符。
到目前为止,我们已经学习了如何匹配特定的字符、如何使用点字符 . 匹配任意单个字符、如何使用方括号 [] 匹配多个字符中的某一个、以及如何进行取非 ^ 匹配。
Unicode 属性转义支持根据 Unicode 属性进行匹配,例如我们可以用它来匹配出表情、标点符号、字母(甚至适用特定语言或文字)等。同一符号可以拥有多种 Unicode 属性,属性则有 binary ("boolean-like") 和 non-binary 之分。
对元字符以及各种字符集合进行的讨论,必须要提到 POSIX 字符类。POSIX 字符类是许多(但并不是所有)正则表达式实现都支持的一种简写形式。
通过前面的学习,我们已经把正则表达式模式匹配操作的基础知识全都介绍给了大家,但我们给出的每个例子都有一个非常严格的限制。现在,请大家思考一下,如何构造出一个匹配电子邮箱地址的正则表达式。
上节学习的 + 、 * 、 ? 解决了许多问题,但有些问题光靠它们还不够。请思考以下问题:
? 只能匹配零个或一个字符, 和 {m,n} 也有一个重复次数的上限;换句话说,这几种语法所定义的重复次数都是有限的。但 * 和 + 都是没有重复次数限制的,这样就会出现过度匹配的的现象。
位置匹配用来解决在什么地方进行字符串匹配操作的问题。为了让大家对位置匹配及其相关概念有一个直观的认识,我们先来看一个例子:
第一种边界,也是最常用的边界,是由限定符 \b (boundary)指定的单词边界。顾名思义, \b 用来匹配单词的开始或结尾。
单词边界可以用来进行与单词有关的位置匹配(单词的开头、单词的结束、整个单词,等等)。字符串边界有着类似的用途,只不过是用来进行与字符串有关的位置匹配而已(字符串的开头、字符串的结束、整个字符串,等等)。
我们在第 5 章学习了如何匹配一个字符的连续多次重复。正如我们讨论的那样, \d+ 将匹配一个或多个数字字符,而 https?// 或 https://。
子表达式允许嵌套。事实上,子表达式允许多重嵌套,这种嵌套的层次在理论上没有限制,但在实际工作中还是应该遵循适可而止的原则。
前端程序员经常使用标题标签来定义和排版网页里面的标题文字。现在,我们不妨假设你需要把某个页面里的所有标题全部查找出来,而不管它的级别是多少。
前端程序员经常使用标题标签来定义和排版网页里面的标题文字。现在,我们不妨假设你需要把某个页面里的所有标题全部查找出来,而不管它的级别是多少。
前端程序员经常使用标题标签来定义和排版网页里面的标题文字。现在,我们不妨假设你需要把某个页面里的所有标题全部查找出来,而不管它的级别是多少。
我们先来看一下例子。
我们先来看一下例子。
我们先来看一下例子。
我们先来看一下例子。
第7章介绍了子表达式的基本用途之一:把一组字符编组为一个字符集合。这样的字符集合主要用于精确设定需要重复匹配的文本及其重复次数。本章将讨论子表达式的另一个重要用途——定义回溯引用(backreference)。
在继续学习之前,你还应该了解以下几个事实:
到目前为止,我们见过的正则表达式都是用来匹配文本的,但有时我们还需要用正则表达式标记要匹配的文本的位置(而不仅仅是文本本身)。这就引出了前后查找(lookaround)的概念,我们将在这一章对此做专题讨论。
在某些场合,你需要且只需要对某段文本的特定位置进行匹配,这就引出了位置匹配的概念,而这个概念正是本章的学习重点。
元字符和字符是正则表达式的基本构件,它们的用法我们已经在此前的章节里演示过了。在这一章里,你们将学习如何运用子表达式(subexpression)的概念对表达式进行分组和归类。
在本章节时,你将学习如何与字符集合打交道。与可以匹配任意单个字符的 `.` 字符不同,字符集合只能匹配特定的字符和字符区间。
正则表达式还有一种威力强大但不经常用的功能——在表达式的内部嵌入条件处理功能。
在这一章里,大家将学习如何使用更多的元字符云匹配特定的字符或字符类型。
在这一章里,大家将学习如何匹配多个连续重复出现的字符或字符集合。
无论是前端开发、后端开发、文档工程师、作家、UP 主,只要是需要和文本打交道的,都或多或少可以用到正则表达式。