如果您想掌握正则表达式并了解它们在 JavaScript 中的工作原理,那么这本书就适合您。
第一章:正则表达式简介
什么是正则表达式?
你可能会看到这些写作正则表达式、regex或RegExp,但它们都指的是同一件事。 正则表达式是一系列用于匹配字符串的字符。使用正则表达式匹配字符串可能需要使用一组特殊的字符,称为"元字符"和"量词符"。 由于正则表达式是一种强大的工具,当你将其与编程语言结合使用时,可以做的事情远不止"匹配字符串"。 现代时代几乎所有主要的编程语言都内置了对正则表达式的支持。有些编程语言甚至可能有专门的库,帮助你更方便地使用正则表达式。 除了在编程语言中使用正则表达式之外,其他允许你使用正则表达式的工具包括:
- 文本编辑器和IDE:用于在VS Code、Visual Studio、Notepad++、Sublime Text等中进行搜索和替换。
- 浏览器开发工具:主要用于浏览器内搜索(带有扩展或插件)和在开发工具内搜索。
- 数据库工具:用于数据挖掘。
- 正则表达式测试器:您可以粘贴文本并编写正则表达式来匹配它们 - 这是学习正则表达式的一个非常好的方法。这本书对这个选项进行了相当多的探讨。
正则表达式简史
正则表达式拥有丰富而迷人的历史,已经延续了七十多年。这段历史随着计算机科学和编程语言的发展而不断演变。正则表达式的概念可以追溯到上世纪50年代。美国数学家斯蒂芬·科尔·克里恩引入了它们作为形式语言中定义模式的符号表示法。克里恩的工作也为理论计算机科学奠定了基础。
在上世纪 60 年代初,第一批正则表达式实现出现了。贝尔实验室的计算机科学家肯·汤普森开发了一个名为QED的文本编辑器,利用正则表达式进行模式匹配。QED
的功能提供了一种更高效地搜索和操作文本的方式。
该概念在汤普森和丹尼斯·里奇于上世纪70年代初创建Unix操作系统时进一步普及。他们将正则表达式纳入各种Unix实用程序中,尤其是 ed
文本编辑器和后来的 sed
流编辑器。这些工具使用户能够执行复杂的文本操作任务,显著提高了文本处理的效率和能力。
1973 年,汤普森与阿尔弗雷德·阿霍和彼得·温伯格合作开发了一个名为grep
(全局正则表达式打印)的新工具,作为 Unix 工具包的一部分。
Grep
允许用户使用正则表达式搜索文件中的特定模式。grep
的简单和有效性使其成为广泛采用的工具。它还将正则表达式确立为Unix-based
系统的标准特性。
随着计算机系统和编程语言的发展,正则表达式被集成到各种软件开发环境中。上世纪70年代末,创建了AWK编程语言。AWK
启发了拉里·沃尔创建Perl
,并在1987年向公众提供。沃尔认识到正则表达式在文本处理中的价值,并将其集成到Perl
中。Perl
将正则表达式集成到其语法中,使其成为文本匹配和数据提取任务的流行语言。这种集成形成了PCRE(Perl兼容正则表达式),一种正则表达式风格和库,您可以在Perl
、Python
、PHP
、Java
等一些编程语言中使用。
正则表达式继续发展,并在Unix
和Perl
之外找到应用。上世纪 80 年代,国际标准化组织(ISO)制定了 POSIX 标准,其中包括对正则表达式的规范。这种标准化确保了不同实现和系统之间的兼容性和一致性。
随着互联网和万维网在上世纪 90 年代的兴起,正则表达式在Web开发和数据处理中得到广泛应用。它们成为许多脚本语言的基本组成部分,为开发人员提供了强大的文本处理、表单验证和从Web页面中提取数据的工具。
例如,JavaScript
一直具有内置的 PCRE 版本,用于处理正则表达式。但是,随着 ECMAScript 的发布,1999 年引入了RegExp() 构造函数。这使得 JavaScript 开发人员能够直接在其代码中使用正则表达式,以 JavaScript 方式。 在 21 世纪初期,专门关注正则表达式的工具和库出现,使开发人员更容易使用它们。像 PCRE(Perl Compatible Regular Expressions)这样的库提供了增强功能和更好的性能,进一步扩展了正则表达式的使用和功能。
今天,正则表达式是编程语言和文本处理工具(如您的代码编辑器)不可或缺的一部分。它们得到几乎所有主要编程语言(包括Java、C#、Ruby 和 PHP)的支持。
集成开发环境(IDE)和代码编辑器(如 Visual Studio、VS Code 和 Notepad++)现在也包括基于 regex
的搜索和搜索替换功能,简化了在代码中查找和操作文本的过程。
正则表达式的历史展示了它们从理论概念到实际工具的演变,这些工具已经革新了文本处理和模式匹配。
从贝尔实验室和Unix的早期发展到它们被集成到流行编程语言中,正则表达式已经成为开发人员和系统管理员手中必不可少的工具。Regex使他们能够高效地处理复杂的基于文本的任务。
随着计算机技术的不断进步和对高效文本处理的持续需求,正则表达式可能会在未来数年内继续成为技术领域中不可或缺的一部分。
正则表达式有什么用?
正则表达式非常灵活多变。这使得它们可以应用于各种任务和领域,如计算机编程、数据处理、文本编辑和 Web 发。 这些应用和用途包括但不限于以下内容:
-
字符串匹配:这是开发人员使用正则表达式最常见的方法之一。这也是学习正则表达式的好方法。 您可以将一些文本粘贴到正则表达式引擎中,并编写正则表达式以匹配文本的一部分或整个文本。您还可以搜索包含特定字符序列、以某些字符开头或结尾或匹配复杂模式的字符串。 这使得正则表达式对于搜索关键字、根据字符串模式验证输入或过滤数据非常有价值。
-
密码强度验证:您可以使用正则表达式验证网站和应用程序中密码的强度。 通过使用正则表达式定义一组规则,开发人员可以强制执行特定的密码要求,例如最少字符数、大写和小写字母、数字和特殊字符的组合。
-
表单验证:验证表单输入或独立输入是开发人员使用正则表达式的另一种流行方式。 正则表达式提供了一种简洁高效的方法,以确保输入数据遵循特定的模式或格式。无论是验证用户名、电子邮件地址、电话号码、信用卡号码、邮政编码还是其他输入,正则表达式都可以帮助您强制执行验证规则并维护数据完整性。
-
文本搜索和操作:正则表达式在搜索文本中的特定模式并基于这些匹配执行操作方面表现出色。它们是数据挖掘、日志分析和文本处理等任务的强大工具。 无论您需要查找特定单词或短语的出现次数、从文本中提取结构化数据、分析内容还是执行字符串匹配,正则表达式都提供了高效的模式匹配能力。
-
使用 URL 和 URI:由于 URL 和 URI 是 Web 开发的重要组成部分,正则表达式可以帮助验证、解析和操作它们。这使得开发人员可以确保Web地址的正确性和结构,验证字符串是否为有效URL,并帮助提取特定组件,例如域、路径、查询参数或片段。 在URL路由、重写或提取查询参数等任务中,这种功能特别有用。
-
在 IDE 和文本编辑器中搜索和替换:正则表达式提供了复杂的搜索功能。这使得开发人员可以找到特定模式(例如具有特定前缀或字符序列的单词),然后用指定的文本替换匹配项。这内置于现代文本编辑器如 VS Code 和Notepad++ 中。
-
数据提取和爬取:正则表达式在数据提取和 Web 爬取中发挥着重要作用。它们允许开发人员通过定义匹配所需数据的模式来从非结构化或半结构化文本中提取特定信息。 当从HTML或XML文档等来源提取数据时,它们也非常有价值,因为它们能够基于定义的模式高效地检索信息。
-
语法高亮:正则表达式通常用于 IDE 和文本编辑器中提供语法高亮。这最终有助于用户通过为关键字、字符串、注释和其他语言特定结构分配颜色或格式来在视觉上区分代码或文档的不同部分。 正则表达式用于识别和匹配这些语言特定模式,使代码更易读,增强整体编辑体验。
正则表达式的风格
"正则表达式的风格"一词指的是不同编程语言、库或工具中正则表达式的具体实现和语法变化。
虽然正则表达式的核心概念保持不变,但是正则表达式的编写和解释细节在不同环境中可能会有所不同。
每种正则表达式的风格可能都有自己的元字符、语法规则和基本功能以外的其他特性。
这些差异可能包括字符类、元字符、捕获组和断言语法的变化,以及命名捕获组、前瞻和后顾等额外功能。 今天有许多正则表达式的风格可用。其中一些是:
-
基本正则表达式(BRE) :这种类型通常在Unix工具(如
sed
和grep
)中找到。它使用一组有限的元字符和功能。通配符(.)
和零个或多个(*)
元字符在其中可用。 -
扩展正则表达式(ERE) :ERE 是BRE 的扩展。它提供了额外的元字符和功能。除了 BRE 中可用的元字符外,ERE 还引入了像带括号的分组
(())
,使用管道符号(|)
进行交替以及使用花括号({})
指定重复范围等功能。 -
Perl兼容正则表达式(PCRE):PCRE 是一种流行的类型,由多种编程语言(如Perl、Python、PHP 和 JavaScript)支持。PCRE通过强大的功能扩展了基本正则表达式语法,例如前瞻和后顾断言、反向引用、非捕获组以及用于单词边界的\b。
-
JavaScript正则表达式 :
JavaScript
有自己的正则表达式类型,类似于 PCRE,但有一些不同之处。它支持基本功能,如带方括号的字符类([])
、元字符(*、+、?等)
和捕获组())
。JavaScript
还提供其他功能,如全局标志/g
以执行多个匹配,以及不区分大小写匹配的忽略大小写标志/i
。 -
Python正则表达式 :
Python
的re
模块实现了与 PCRE 类似但有一些变化的类型。它支持诸如字符类[]、元字符(*、+和?)
和捕获组(())
等功能。re
模块还具有独特的原始字符串语法(r'')
以简化使用反斜杠。
在使用不同编程语言或工具中的正则表达式时,了解所使用的正则表达式类型非常重要。这确保您使用正确的语法并利用该特定类型提供的任何独特功能或能力。
注意:不要过于关注本部分中提到的元字符(和量词)。您将在本书的第5章中看到它们的实际应用。
使用正则表达式的工具
正则表达式工具是编程语言、库和框架、命令行实用程序、在线正则表达式测试工具、文本编辑器和集成开发环境以及应用程序,旨在帮助您在日常工作中创建、测试和应用正则表达式。有许多可用于处理正则表达式的工具。让我带您了解一下正则表达式测试工具、编程语言、库、文本编辑器和集成开发环境以及命令行工具。
- 正则表达式测试人员 正则表达式测试工具是专门用于创建和测试正则表达式的在线测试环境。例如 regex101.com、regexr.com 和 regexpal.com 等网站。
这些正则表达式测试工具的用户界面通常有一个输入框用于编写正则表达式,另一个输入框用于测试正则表达式的文本。
以下是 regexpal.com 的用户界面:
更高级的网站(例如 regex101.com)可让您选择要使用的正则表达式的风格、正则表达式的说明以及匹配信息。
regex101.com 的 UI 如下所示:
这些在线正则表达式测试器的好处之一是它们有助于学习正则表达式。其中很多都提供实时匹配和备忘单,您可以快速查看。许多使用正则表达式的开发人员都使用过它们。
除了学习之外,您还可以通过使用它们创建正则表达式并将它们粘贴到您想要使用正则表达式的任何位置来使用它们。这就是我创建正则表达式的方式。
-
编程语言
几乎所有现代编程语言都内置了对正则表达式的支持。因此它们都有创建和测试正则表达式的方法。
例如,JavaScript 有用于处理正则表达式的
RegExp()
构造函数,Python 有re
模块,Java 有java.util.regex
包,Perl 直接内置了正则表达式。 -
库和框架
许多编程语言都有独立的库和框架,可以更轻松地创建正则表达式。
用于 JavaScript 的
XRegExp
、用于 Perl 的 PCRE(Perl 兼容正则表达式)、用于 Golang 的 Go-Restruction 以及跨平台正则表达式库 Verbal Expressions -
文本编辑器和 IDE
许多文本编辑器和 IDE(例如 VS Code、Visual Studio、Notpad++、Atom、Sublime Text、IntelliJ IDEA 等)都内置了对正则表达式的支持。
开发人员最常见的用途是搜索、搜索和替换。此外,这些文本编辑器和 IDE 中的语法突出显示通常是使用正则表达式来实现的。
-
命令行工具
grep 和 sed 等 Unix 命令行工具允许您对文本文件和流执行正则表达式操作。这样,您可以搜索、过滤和操作多个文件。
使用这些 Unix 工具,您还可以使用自定义搜索行为和自定义复杂文本转换的选项。
正则表达式的基本概念
正则表达式的基本概念和语法是创建、测试和应用搜索、匹配和操作字符串模式所涉及的构建块。
这包括文字字符、元字符、量词、字符类、锚点和边界以及转义字符等概念。更高级的是分组、反向引用、前向断言和后向断言。这包括文字字符、元字符、量词、字符类、锚点和边界以及转义字符等概念。更高级的是分组、反向引用、前向断言和后向断言。
正则表达式用户利用其中许多概念来构建用于处理文本的高效正则表达式。很多时候,基本的就足够了。但如果您想创建更高级的正则表达式,那么更高级的正则表达式对您也很有用。
本书不会遗漏任何概念。我将向您展示如何在正则表达式测试器中使用它们以及如何在 JavaScript 中使用它们,因为这就是本书的目的。
第一章就到这了,期待下一章: 如何匹配正则表达式中的文字字符和字符集