你应该学习正则表达式

点击此处查看最新的网赚项目教程

Regular Expressions (Regex):正则表达式,软件工程中最为强大,且广泛适用,令人信服的技术之一。从验证电子邮件地址到执行复杂的代码重构器,正则表达式的用途非常广泛,是任何软件工程师工具箱中必不可少的条目。

电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是

什么是正则表达式?

正则表达式(或Regex,或Regexp)是使用字符序列描述复杂搜索模式的一种方式。

然而,专门的Regex语法由于其复杂性使得有些表达式变得不可访问。例如,下面的这个基本的正则表达式,它表示24小时制HH / MM格式的时间。

如果你觉得这看上去略显复杂,别担心,当我们完成这个教程时,理解这个表达式将会是小菜一碟。

Learn once, write anywhere

几乎任何编程语言都可以使用Regex。Regex的知识对于验证用户输入,与Unix shell进行交互,在你喜欢的文本编辑器中搜索/重构代码,执行数据库文本搜索等等都非常有用。

在本教程中,我将尝试在各种场景、语言和环境中对Regex的语法和使用进行简明易懂的介绍。

此Web应用程序是我用于构建、测试和调试Regex最喜欢的工具。我强烈推荐大家使用它来测试我们将在本教程中介绍的表达式。

本教程中的示例源代码可以在Github存储库中找到——

0 – 匹配任何数字行

我们将从一个非常简单的例子开始——匹配任何只包含数字的行。

让我们一点一点的解释吧。

我们可以用伪英文重写这个Regex为[start of line][one or more digits][end of line]。

很简单,不是吗?

我们可以用d替换[0-9],结果相同(匹配所有数字)。

这个表达式(和一般的正则表达式)的伟大之处在于它无需太多修改,就可以用到任何编程语言中。

为了演示,我们先快速了解如何使用16种最受欢迎的编程语言对文本文件执行此简单的Regex搜索。

我们使用以下输入文件(test.txt)为例。

电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是

每个脚本都将使用这个正则表达式读取并搜索test.txt文件,并将结果('1234', '5362', '1')输出到控制台。

语言范例0.0 – Javascript / Node.js / Typescript

电子邮件工具软件是_电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

0.1 – Python

电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是

0.2 – R

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

0.3 – Ruby

电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是

0.4 – Haskell

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

0.5 – Perl

电子邮件工具软件是_电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

0.6 – PHP

电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是_电子邮件软件工具有哪些

0.7 – Go

电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些_电子邮件工具软件是

0.8 – Java

电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是

0.9 – Kotlin

电子邮件软件工具有哪些_电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

0.10 – Scala

电子邮件软件工具有哪些_电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

0.11 – Swift

电子邮件软件工具有哪些_电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

0.12 – Rust

电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些_电子邮件工具软件是

0.13 – C#

电子邮件工具软件是_电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

0.14 – C++

电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是

0.15 – Bash

以十六种语言编写出相同的操作是一个有趣的练习,但是,接下来在本教程中,我们将主要使用Javascript和Python(最后还有一点Bash),因为这些语言(在我看来)倾向于产生最清晰和更可读的实现。

1 – 年份匹配

我们来看看另外一个简单的例子——匹配二十或二十一世纪中任何有效的一年。

我们使用b而不是^和$来开始和结束这个正则表达式。b表示单词边界,或两个单词之间的空格。这允许我们在文本块(而不是代码行)中匹配年份,这对于搜索如段落文本非常有用。

请注意b不同于s,s是用于空格字符的代码。b搜索一个单词字符前面或者后面没有另一个字符的地方,因此它搜索单词字符的缺失,而s明确搜索空格字符。b特别适用于我们想要匹配特定序列/单词的情况,而不是特定序列/单词之前或之后有空格的情况。

1.0 – 真实示例 – 计数年份

我们可以在Python脚本中使用此表达式来查找维基百科历史部分的文章中提及20或21世纪内年份的次数。

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

上述脚本将按照提及的次数依次打印年份。

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

2 – 匹配时间

现在我们要定义一个正则表达式来匹配24小时格式(MM:HH,如16:59)的任何时间。

这里唯一新的概念是,我们使用2来匹配第二个捕获组,即分隔符(/或-)。这使得我们能够避免重复模式匹配规范,并且要求分隔符是一致的(如果第一个分隔符是/,那么第二个分隔符也必须一样)。

3.0 – 捕获组替换

通过使用捕获组,我们可以动态地重组和转换我们的字符串输入。

引用捕获组的标准方法是使用$或符号,以及捕获组的索引(请记住捕获组元素是完整的捕获文本)。

3.1 – 真实示例 – 日期格式转换

假设我们的任务是将使用国际日期格式(DAY/MONTH/YEAR)的文档集合转换为美式(MONTH/DAY/YEAR)日期样式。

我们可以通过替换模式$3$2$1$2$4或32124使用上述正则表达式。

让我们分解捕捉组。

替换模式(32124)简单地交换了表达式中月份和日期的内容。

以下是我们如何在Javascript中进行这种转换:

电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些_电子邮件工具软件是

上述脚本将打印Today's date is 09/18/2017到控制台。

同样的脚本在Python中是这样的:

电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是_电子邮件软件工具有哪些

4 – 电子邮件验证

正则表达式也可用于输入验证。

以上是一个(过于简单的)Regex,用来匹配电子邮件地址。

4.0 – 真实示例 – 验证电子邮件

假设我们要创建一个简单的Javascript函数以检查输入是否为有效的电子邮件。

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

此脚本的输出应为

注意——在现实应用程序中,使用Regex验证电子邮件地址对于许多情况,例如用户注册,是不够的。但是一旦你确认输入的文本是电子邮件地址,那么你应该始终遵循发送确认/激活电子邮件的标准做法。

4.1 – 完整的电子邮件Regex

这是一个非常简单的例子,它忽略了许多非常重要的电子邮件有效性边缘情况,例如无效的开始/结束字符以及连续的周期。我真的不建议在你的应用程序中使用上述表达式;最好是使用一个有信誉的电子邮件验证库或继续探索更完整的电子邮件验证Regex。

例如,下面是一个来自emailregex.com的更高级的表达式,它匹配99%的RFC 5322兼容的电子邮件地址。

电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是_电子邮件软件工具有哪些

不过今天我们不打算深入探讨。

5 – 代码注释模式匹配

Regex最有用的特殊用法之一是可以成为代码重构器。大多数代码编辑器支持基于Regex的查找/替换操作。一个格式正确的Regex替换可以将繁琐的需要半小时忙碌的工作变成一个漂亮的Regex重构魔法。

不要编写脚本来执行这些操作,试着在你选择的文本编辑器中去做。几乎每个文本编辑器都支持基于Regex的查找和替换。

以下是一些受欢迎的编辑器指南。

Sublime中的Regex替换——#using-regular-expressions-in-sublime-text

Vim中的Regex替换——#backreferences

VSCode中的Regex替换——#_advanced-search-options

Emacs中的Regex替换——

5.0 – 提取单行CSS注释

如果我们想要查找CSS文件中的所有单行注释怎么办?

CSS注释以/* Comment Here */的格式出现。

要捕获任何单行CSS注释,我们可以使用以下表达式。

在这里,我们只是在每个捕获组之间添加了一个换行符n。

尝试在有以下内容的文件上执行此替换。

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

替换将产生相同的文件,但每个单行注释转换为多行注释。

电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是_电子邮件软件工具有哪些

5.2 – 真实示例 – 标准化CSS注释开头

假设我们有一个又大又杂乱的CSS文件,是由几个不同的人写的。在这个文件中,有些注释以/*开头,有些以/**开头,还有些以/*****开头。

让我们来写一个Regex替换以标准化所有的单行CSS注释,以/*开头。

为了做到这一点,我们将扩展表达式,只匹配以两个或更多星号开头的注释。

这个表达式与原来的非常相似。主要区别在于开头我们用*{2,}替换了*+。*{2,}语法表示*的“两个或多个”实例。

为了规范每个注释的开头,我们可以通过以下替代。

让我们在以下测试CSS文件上运行此替换。

电子邮件软件工具有哪些_电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

结果将是与标准注释开头相同的文件。

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

6 – 匹配网址

另一个非常有用的Regex是在文本中匹配URL。

下面是一个来自Stack Overflow的URL匹配表达式的示例。

电子邮件工具软件是_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件软件工具有哪些

电子邮件工具软件是_电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-

脚本将打印在原始网页HTML内容中找到的每个域名。

电子邮件软件工具有哪些_电子邮件工具软件有什么,0,0,0,0.0,0,0,0,,-_电子邮件工具软件是

7 – 命令行的用法

许多Unix命令行实用程序也支持Regex!我们将介绍如何使用grep查找特定文件,以及使用sed替换文本文件内容。

7.0 – 真实示例 – 用grep匹配图像文件

我们将定义另一个基本的Regex,这次是用于匹配图像文件。

My email is patrick.triest@gmail.com

命令运行后,电子邮件将从test.txt文件中进行编辑。

My email is {redacted}

警告——此命令将自动从你传递的任何test.txt中删除所有电子邮件地址,因此,在运行它的时候要小心,因为此操作无法逆转。要在终端中预览结果,而不是替换原来的文本,只需省略-i标志。

注意——尽管上述命令适用于大多数Linux发行版,但是macOS使用BSD实现是sed,它在其支持的Regex语法中受到更多的限制。要在MacOS上使用sed,并具有体面的正则表达式支持,我建议使用brew install gnu-sed安装sed的GNU实现,然后从命令行使用gsed而不是sed。

8 – 什么时候不使用Regex

好的,知道Regex是一个强大又灵活的工具了吧?!那么,有没有应该避免编写Regex的时候?有!

8.0 – 语言解析

解析结构化语言,从英语到Java到JSON,使用正则表达式都是一种真正的痛苦。

当数据源中的边缘情况或次要语法错误导致表达式失败时,将导致最终(或即时)的灾难,出于此目的去编写你自己的正则表达式可能会让你心情沮丧。

强化的解析器几乎可用于所有机器可读的语言,而NLP工具可用于人类语言——我强烈建议你使用其中一种,而不是尝试编写自己的语言。

8.1 – 安全 – 输入过滤和黑名单

使用Regex过滤用户输入(例如来自Web表单),以及防止黑客向应用程序发送恶意命令(例如SQL注入),看上去似乎很诱人。

在这里使用自定义的Regex是不明智的,因为它很难覆盖每个潜在的攻击向量或恶意命令。例如,黑客可以使用替代字符编码绕过编写得不全面的输入黑名单过滤器。

这是另一个实例,对此我强烈建议你使用经过良好测试的库和/或服务,以及使用白名单而不是黑名单,以保护你的应用程序免受恶意输入。

8.2 – 性能密集的应用程序

正则表达式的匹配速度可以从不是非常快到极慢的范围变动,取决于表达式写得怎么样。对于大多数用例来说,这很好,特别是如果匹配的文本很短(例如电子邮件地址表单)的话。然而,对于高性能服务器应用程序,正则表达式会成为性能瓶颈,特别是如果表达式写得不好或被搜索的文本很长的话。

8.3 – 对于不需要Regex的地方

正则表达式是一个非常有用的工具,但这并不意味着你应该在任何地方使用它。

如果问题有替代的解决方案,解决方案更简单和/或不需要使用Regex,那么请不要只是为了显摆而使用Regex。Regex很棒,但它也是最不可读的编程工具之一,而且很容易出现边缘情况和bug。

过度使用Regex会让你的同事(以及需要工作在你的代码上的任何人)生气恼怒,甚至恨不得揍你一顿。

结论

我希望这是对Regex的许多用途的一个有用的介绍。

还有很多Regex的用例是我们没有涵盖的。例如,可以在PostgreSQL查询中使用Regex来动态地搜索数据库中的文本模式。

我们还漏下了许多强大的Regex语法特性没有覆盖,如lookahead,lookbehind,atomic groups,recursion和subroutines。

要提高正则表达式技能并了解有关这些功能的更多信息,我推荐以下资源。

本教程中示例的源代码可以在Github存储库中找到——

欢迎随时对本教程提出任何建议、看法或批评。

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: qs62318888

主题授权提示:请在后台主题设置-主题授权-激活主题的正版授权,授权购买:RiTheme官网

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注