这是一篇正则表达式的图解指南,这个指南适合那些从未摆弄过,刚开始想要学习正则表达式,却被吓了个半死的人(像我一样)。对没有受过正规计算机教育的人来说,正则表达式好像是只有最核心的 Unix 程序员才敢接触。
但其实不然。一个好的正则表达式看似神奇,但要记住这一点:任何足够先进的技术都跟魔法无异。所以我们不要被它给吓到,这篇文章让我们从最基础的知识开始,了解什么是正则表达式以及它们用于什么?
开始!
正则表达式的核心是定义搜索模式的字符序列。通常用在像grep这样的工具中,可以在更长的文本字符串中查找我们想要的内容。
假设有这么一个文件 cat.txt ,内容很简单,只有三行:
cat cat2 dog
如果我们使用 cat 这样的表达式来进行检索,那么我们可以获得结果
cat cat2
(对于硬核用户来说,在这篇文章中,我把正则表达式和使用正则表达式的工具(如grep)混淆。我知道这在技术上是错误的,只是为了表达方便)
正则表达式适用于字符,而不是单词
在这里需要强调的是:正则表达式适用于字符,而不是单词。串联是隐含的。
如果我们使用正则表达式搜索模式cat,我们不是在寻找“cat”这个词,而是我们正在寻找字符 c 而后跟一个a,而后又跟 t 字符。
点和星号
最基本的字符是单个字符,如a,b,c等。现在让我们介绍两个特殊的客人。
点号(.) 字符匹配任何单个字符。例如,如果我们搜索c.t,我们将匹配从cat到c0t或cAt的任何内容,我们将匹配任何单个c,后跟任何字符,后跟单个t 字符。
*(星号)字符有点难度。它修改前面的字符,然后匹配零个或多个字符。是的,再读一遍,零个或多个字符。例如,cat *会匹配cat,catt,cattttt但也会匹配。
猫吃了我的作业
想象一下,我们逐行读取文件,第一行如下:
The cat ate my homework.
让我们来看看我们如何匹配这一行中的 cat 这个模式。
我们首先将模式的第一个字符与句子中的第一个字符进行匹配。
如果我们找不到匹配项,我们会跳到该行中的下一个字符,并从该模式的第一个字符开始。
如果我们找到匹配项,我们将转到模式和行中的下一个字符并重复此过程。当我们找到整个模式的匹配时,我们返回找到匹配的行。
这就是正则表达式最常用于最基本的级别,以便在更大的字符串中找到更小的搜索模式。
到目前为止,我们已经了解了正则表达式和两个特殊字符,即 . 号和 *(星号),但还有更多。
正则表达式三剑客
正则表达式包含三个主要的组件:
-
锚
-
字符集
-
修饰符
这三个组成了...正则表达式三剑客!
我们先从锚点开始。
锚点
锚点指定图案相对于线条的位置。这是两个最重要的锚点:
-
^(插入符号)将您的模式匹配到行的开头。例如,模式^ 1匹配以1开头的任何行。
-
$(美元)将您的模式匹配到句子的末尾。例如,9 $匹配任何以9结尾的行。
请注意,在这两种情况下,模式必须分别在模式中的第一个和最后一个。^ 1在一行开头匹配1,但1 ^匹配1后跟^。同样,1 $匹配以1结尾的行,但$ 1匹配一个美元符号,后跟行上的任意位置1。
下一部分是字符集。
字符集
字符集是正则表达式的面包和黄油。单个字符,比如a,是最原子的字符集(一个元素的集合)。但是我们可以使用像[0-9]那样匹配任何单个数字的正则表达式来做疯狂的事情,或者如果你还记得我们可以制作模式[0-9] [0-9] *(这个模式匹配的是什么) 作为读者的练习)。
其他一些重要的字符集:
-
[0-9] 匹配任意单个数字
-
[a-z] 匹配任意小写字母
-
[A-Z] 匹配任意大写字母
我们也可以合并多个字符集:
-
[A-Za-z0-9] 匹配任意大写、小写字母以及数字
修饰符
这里我不想太深入的介绍,我们之前已经使用的 *(星号)是一个修饰符。修饰符会更改其前面字符的含义。还有许多其他修饰符,但从 * 开始比较容易理解。
一个具体的例子
首先我们快速生成一个包含某些文本的文件:
$ echo "The cat jumps long time \nThen we also have the fact that these are words.\n1234 this is a test post please ignore." >> grep.txt
文件内容如下:
$ cat grep.txt
The cat jumps long time
Then we also have the fact that these are words.
1234 this is a test post please ignore.
然后咱们搜索一下 cat
$ grep "cat" grep.txt
The cat jumps long time
接下来我们搜索任意以数字开头的行
$ grep "^[0-9]" grep.txt
1234 this is a test post please ignore.
你刚刚就在使用正则表达式,是不是棒极了?
总结
在这篇文章中我们介绍了:
-
正则表达式的基本功能
-
正则表达式的三个主要的组件:锚点、字符集和修饰符
-
. (点), * (星号), ^ (插入符号) 以及 $ (美元符).
-
一些字符集 [0-9], [a-z], [A-Z] 和字符集的合并
这篇博文的目的是通过插图介绍使正则表达式更加容易理解。
如果你已经摆脱了正则表达式在技术上的困难,你最终就得到的是一个相对简单但超级强大的工具。
给自己点赞吧,你已经没资格当菜鸟了!
本文翻译自 https://www.janmeppe.com/blog/regex-for-noobs/ 。
图文版请看公众号“红薯胡说”