正则表达式入门书籍
无论是Linux用户,系统管理员,还是程序员,正则表达式都可以成为工具箱中功能最强大的工具之一。 它也可能是最艰巨的学习之一,但不一定! 尽管有无数种编写表达式的方法,但您不必学习每个开关和标志。 在这个简短的方法中,我将向您展示一些使用正则表达式的简单方法,这些方法可以让您立即运行,并共享一些后续资源,如果愿意的话,可以使您成为正则表达式的主人。
快速概述
正则表达式,也称为“ regex”模式或什至“ regular statement”,简单来说就是“定义搜索模式的字符序列”。 这个想法是在1950年代提出的,当时斯蒂芬·科尔·克莱因(Stephen Cole Kleene)写了一个他称为“常规语言”的思想的描述,其中一部分被称为“克莱因定理”。 在很高的层次上,它表示如果可以定义语言的元素,则可以编写表达式以匹配该语言内的模式。
g/re/p
,这实际上意味着 “对这个正则表达式进行全局搜索并打印行”。
凉!
为什么我们需要正则表达式
如上所述,正则表达式用于定义模式,以帮助我们在匹配该模式的对象上“匹配”或“查找”对象。 例如,当使用find
命令时,这些对象可以是文件系统中的文件,也可以是文件中的文本块,例如,我们可以使用grep , awk , vi或sed进行搜索。
从基础开始
让我们从头开始。 这是一个很好的起点。
每个人似乎都学习的第一个正则表达式可能是您已经知道并且没有意识到它是什么的正则表达式。 您是否曾经想过打印目录中的文件列表,但是时间太长了? 也许您看到有人键入\*.gif
在目录中列出GIF图像,例如:
$ ls *.gif
那是一个正则表达式!
在编写正则表达式时,某些字符具有特殊含义,以使我们能够从仅匹配字符变为匹配整个字符集。 在这种情况下, *
字符(也称为“ star”或“ splat”)代替文件名,并允许您匹配所有以.gif
结尾的文件。
搜索文件中的模式
regex foo培训中的下一步是在文件中搜索模式,尤其是使用replace模式进行快速更改。
两种常见的方法是:
- 使用vi打开文件,搜索模式并进行更改(甚至使用replace自动进行更改)。
- 使用又名“流编辑器”,以编程方式在文件中搜索并进行更改。
首先,使用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](https://i-blog.csdnimg.cn/blog_migrate/873b15dda3873d91c99d20eda77b92dd.png)
接下来,让我们使用$
符号,在正则表达式中该符号是“结尾为”。
/test$
![“测试”突出显示 'Test' highlighted](https://i-blog.csdnimg.cn/blog_migrate/412f3fa948815d96f723cb1937db8c62.png)
看到它如何突出显示以“ 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]
,也可以组合为范围,例如[az]
,并且字符通常区分大小写。
要在vi中查看此工作,我们需要关闭我们之前设置的忽略情况。 让我们键入: set noic
以再次忽略大小写。
用作范围的一些常见字符类别是:
- az-所有小写字符
- AZ-所有大写字符
- 0-9 –数字
现在,让我们尝试类似于我们之前进行的搜索:
/tT
您注意到它什么也没发现吗? 这是因为以前的正则表达式正好查找“ tT”。 如果我们将其替换为:
/[tT]
我们将看到在整个文档中小写字母T和大写字母T都匹配。
![字母“ t”突出显示 Letter 't' highlighted](https://i-blog.csdnimg.cn/blog_migrate/d820257b8bf4dd3b3e9c786bd77efe5f.png)
现在,让我们将几个班级范围链接在一起,看看我们得到了什么。 尝试:
/[A-Z1-3]
![大写字母和123突出显示 capital letters and 123 are highlighted](https://i-blog.csdnimg.cn/blog_migrate/9cf9b5e5f434c6761121ff07e4e8cdd0.png)
请注意,大写字母123和123突出显示,但小写字母(包括第五行的结尾)未突出显示。
标志
开始正则表达式训练的最后一步是了解存在的标志,以搜索特殊类型的字符,而无需在范围内列出它们。
-
.
–任何字符 -
\s
–空格 -
\w
–字 -
\d
–数字(数字)
例如,要查找示例文本中的所有数字,请使用:
/\d
请注意,在下面的示例中,所有数字都突出显示。
![数字突出显示 numbers are highlighted](https://i-blog.csdnimg.cn/blog_migrate/d98d9d9a81695c473510db5a9312b440.png)
为了反之,通常使用相同的标志,但要大写。 例如:
-
\S
–不是空格 -
\W
–一言不发 -
\D
–不是数字
请注意,在下面的示例中,通过使用\D
,将突出显示除数字以外的所有字符。
![除数字外的所有字符都突出显示 all characters EXCEPT the numbers are highlighted](https://i-blog.csdnimg.cn/blog_migrate/1b4eca3433bd58a385c52101fd8b549f.png)
用sed搜索
关于sed的快速说明:它是流编辑器,这意味着您无需与用户界面进行交互。 它将流从一侧传入,并将其写出另一侧。
使用sed与vi非常相似,不同之处在于您为它提供了正则表达式以进行搜索和替换,并返回输出。 例如:
sed s/dog/cat/ examples
将以下内容返回到屏幕:
![搜索和替换 Searching and replacing](https://i-blog.csdnimg.cn/blog_migrate/26845eceb27096494ffe120beb7e6791.png)
如果您要保存该文件,则只会有些棘手。 您需要将几个命令链接在一起,以便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
想要查询更多的信息
我希望这对正则表达式有所帮助。 当然,这只是冰山一角,我希望您通过阅读下面的其他资源,继续学习这个强大的工具。
在哪里获得帮助
- 我最喜欢的资源是PERL Pocket Reference
- 要熟练掌握正则表达式,请查看Jeff Friedl的“ 掌握正则表达式” 。
有关更多示例,请查看
翻译自: https://opensource.com/article/18/5/getting-started-regular-expressions
正则表达式入门书籍