正则表达式入门

立即开始使用正则表达式。
286 位读者喜欢这篇文章。
Getting started with 4 practical Python libraries: Prompt Toolkit, Click, Pygments, and Fuzzy Finder

门诺派教会美国档案馆。由 Opensource.com 修改。CC BY-SA 4.0

作为 Linux 用户、系统管理员,甚至程序员,正则表达式可能是您工具箱中最强大的工具之一。它也可能是最令人望而生畏的学习内容之一,但它不必如此!虽然编写表达式的方法无穷无尽,但您不必学习每个开关和标志。在这个简短的入门指南中,我将向您展示一些使用正则表达式的简单方法,让您立即上手,并分享一些后续资源,如果您想成为正则表达式大师,这些资源将帮助您实现目标。

快速概览

正则表达式,也称为“regex”模式,甚至“regular statements”,简单来说就是“定义搜索模式的字符序列”。这个想法起源于 20 世纪 50 年代,当时 Stephen Cole Kleene 写了一篇描述他称为“regular language”的想法的文章,其中一部分后来被称为“Kleene 定理”。从非常高的层面来看,它表示如果可以定义语言的元素,那么就可以编写一个表达式来匹配该语言中的模式。

从那时起,正则表达式就成为了早期 Unix 程序的一部分,包括 vi、sed、awk、grep 等。事实上,grep 这个词来源于最早的“ed”编辑器中使用的命令 g/re/p,它 本质上意味着 “对这个正则表达式进行全局搜索并打印行”。酷!

为什么我们需要正则表达式

如上所述,正则表达式用于定义模式,以帮助我们匹配或“查找”符合该模式的对象。这些对象可以是使用 find 命令时的文件系统中的文件,也可以是文件中的文本块,我们可以使用 grepawkvised 等工具进行搜索。

从基础开始

让我们从最开始的地方开始;这是一个很好的起点。

每个人似乎最先学习的正则表达式可能就是您已经知道但没有意识到是什么的正则表达式。您是否曾经想打印目录中的文件列表,但列表太长?也许您见过有人输入 \*.gif 来列出目录中的 GIF 图像,例如

$ ls *.gif

这就是一个正则表达式!

在编写正则表达式时,某些字符具有特殊含义,允许我们超越仅匹配字符,转而匹配整个字符集。在这种情况下,* 字符,也称为“星号”或“splat”,代替文件名,允许您匹配所有以 .gif 结尾的文件。

在文件中搜索模式

您的正则表达式进阶训练的下一步是在文件中搜索模式,特别是使用替换模式进行快速更改。

两种常用的方法是

  1. 使用 vi 打开文件,搜索模式,并进行更改(甚至使用替换自动进行)。
  2. 使用“流编辑器”,又名 sed,以编程方式在文件中搜索并进行更改。

让我们首先学习一些正则表达式,方法是使用 vi 编辑以下文件

The quick brown fox jumped over the lazy dog.
Simple test
Harder test
Extreme test case
ABC 123 abc 567
The dog is lazy

现在,在 vi 中打开此文件后,让我们看一些正则表达式示例,这些示例将帮助我们在其中找到一些匹配的字符串,甚至自动替换它们。

为了简化操作,让我们将 vi 设置为忽略大小写。键入 set ic 以启用不区分大小写的搜索。

现在,要开始在 vi 中搜索,请键入 / 字符,后跟您的搜索模式。

搜索行首或行尾的内容

要查找以“Simple”开头的行,请使用此正则表达式模式

/^Simple

请注意,在下面的图像中,只有以“Simple”开头的行被突出显示。插入符号 (^) 是正则表达式中“以...开头”的等效符号。

'Simple' highlighted

接下来,让我们使用 $ 符号,在正则表达式中,它是“以...结尾”的意思。

/test$

'Test' highlighted

看看它是如何突出显示以“test”结尾的两行的?另请注意,第四行包含单词 test,但不在末尾,因此该行未突出显示。

这就是正则表达式的强大之处,它使您能够轻松快速地查看大量匹配项,但专门向下钻取到仅精确匹配项。

测试出现频率

为了进一步扩展您的正则表达式技能,让我们看一下更多常见的特殊字符,这些字符允许我们不仅查找匹配的文本,还查找匹配模式。

频率匹配字符

字符 含义 示例
* 零个或多个 ab* – 字母 a 后跟零个或多个 b
+ 一个或多个 ab+ – 字母 a 后跟一个或多个 b
? 零个或一个 ab? – 零个或仅一个 b
{n} 给定一个数字,查找正好是该数字的个数 ab{2} – 字母 a 后跟正好两个 b
{n,} 给定一个数字,查找至少是该数字的个数 ab{2,} – 字母 a 后跟至少两个 b
{n,y} 给定两个数字,查找该数字范围内的个数 ab{1,3} – 字母 a 后跟一到三个 b

查找字符类

正则表达式训练的下一步是在我们的模式匹配中使用字符类。这里需要注意的是,这些类可以组合成列表,例如 [a,d,x,z],也可以组合成范围,例如 [a-z],并且字符通常区分大小写。

要查看此功能在 vi 中的工作方式,我们需要关闭之前设置的忽略大小写功能。让我们键入:set noic 以再次关闭忽略大小写。

一些常用的字符类(用作范围)是

  • a-z – 所有小写字符
  • A-Z – 所有大写字符
  • 0-9 – 数字

现在,让我们尝试一个类似于我们之前运行的搜索

/tT

您注意到它什么也没找到吗?那是因为之前的正则表达式查找的是完全匹配“tT”。如果我们将其替换为

/[tT]

我们将看到文档中同时匹配了小写和大写 T。

Letter 't' highlighted

现在,让我们将几个类范围链接在一起,看看会得到什么。尝试

/[A-Z1-3]

capital letters and 123 are highlighted

请注意,大写字母和 123 被突出显示,但小写字母(包括第五行的末尾)未突出显示。

标志

您正则表达式初级训练的最后一步是了解标志,这些标志用于搜索特殊类型的字符,而无需将它们列在范围中。

  • . – 任何字符
  • \s – 空格
  • \w – 单词
  • \d – 数字

例如,要查找示例文本中的所有数字,请使用

/\d

请注意,在下面的示例中,所有数字都已突出显示。

numbers are highlighted

要匹配相反的情况,通常使用相同的标志,但使用大写形式。例如

  • \S – 不是空格
  • \W – 不是单词
  • \D – 不是数字

请注意,在下面的示例中,通过使用 \D,除了数字之外的所有字符都被突出显示。

all characters EXCEPT the numbers are highlighted

使用 sed 搜索

关于 sed 的简要说明:它是一个流编辑器,这意味着您不与用户界面交互。它接收一侧传入的流并将其写入另一侧。

sed 的使用方式与 vi 非常相似,不同之处在于您需要向其提供要搜索和替换的正则表达式,然后它会返回输出。例如

sed s/dog/cat/ examples

将向屏幕返回以下内容

Searching and replacing

如果要保存该文件,则稍微复杂一些。您需要将几个命令链接在一起,a) 写入该文件,以及 b) 将其复制到第一个文件的顶部。

要执行此操作,请尝试

sed s/dog/cat/ examples > temp.out; mv temp.out examples

现在,如果您查看您的 examples 文件,您将看到单词“dog”已被替换。

The quick brown fox jumped over the lazy cat.
Simple test
Harder test
Extreme test case
ABC 123 abc 567
The cat is lazy

更多信息

我希望这对正则表达式的概述对您有所帮助。当然,这只是冰山一角,我希望您将通过查看下面的其他资源继续学习这个强大的工具。

在哪里获得帮助

有关更多示例,请查看

标签
User profile image.
Jet Anderson 是一位安全代码架构师、CSSLP 和 GWAPT,拥有近 20 年为众多财富 500 强公司开发软件解决方案的经验。他不仅热衷于发现安全缺陷,还热衷于培训忍者来消灭它们。

6 条评论

代替
sed s/dog/cat/ examples > temp.out; mv temp.out examples
使用
sed -i sed s/dog/cat/ examples

其他提示
a) 使用 \ 字符仅转义一个字符 - 搜索 $ 字符而不是行尾
/50\$
b) 使用 \V 字面意思使用行中的所有字符而不是正则表达式
/\V50$ 或 60$
c) 在末尾使用 \c 搜索小写或大写字符
/dog\c
d) 搜索 dog 或 cat
/dog\|cat

*.gif 不是正则表达式,它是 glob。该正则表达式将是 .*\.gif$,您可能必须转义 bash 中的转义符:.*\\\.gif$

可能值得指出的是,命令行上使用的通配符不完全是正则表达式。实际上,bash 手册页将它们称为“模式”而不是正则表达式。

例如,? 作为通配符匹配任何单个字符,它并不意味着“零个或一个前一个字符”。

很容易被这些细微的差异所迷惑。

对于更多关于正则表达式的内容,我觉得我从 Rexegg.com 中获得了很多好东西
我很喜欢它的幽默感。
享受阅读。
http://rexegg.com/

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.