文档章节

如果你跟我一样是菜鸟,那应该看看这篇正则表达式指南

红薯
 红薯
发布于 08/06 07:03
字数 1720
阅读 277
收藏 1

这是一篇正则表达式的图解指南,这个指南适合那些从未摆弄过,刚开始想要学习正则表达式,却被吓了个半死的人(像我一样)。对没有受过正规计算机教育的人来说,正则表达式好像是只有最核心的 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/

图文版请看公众号“红薯胡说”

© 著作权归作者所有

红薯

红薯

粉丝 21762
博文 146
码字总数 64283
作品 8
深圳
产品经理
私信 提问
JVM菜鸟进阶高手之路十四:分析篇

转载请注明原创出处,谢谢! 题目回顾 JVM菜鸟进阶高手之路十三,问题现象就是相同的代码,jvm参数不一样,表现的现象不一样。

匠心零度
2017/11/27
0
0
JVM菜鸟进阶高手之路十四:分析篇

转载请注明原创出处,谢谢! 题目回顾 JVM菜鸟进阶高手之路十三,问题现象就是相同的代码,jvm参数不一样,表现的现象不一样。 jvm参数配置如下: 通过jstat命令,查看结果如下: 关于jstat命...

匠心零度
2017/11/26
0
0
Python 正则表达式 re 模块简明笔记

简介 正则表达式(regular expression)是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串,可以匹配其自身。比如,正则表达式 'hello' 可以匹配字符串 'hello'。 要注意的是,正...

funhacks
2017/11/29
0
0
正则表达式,替换所有HTML标签的简单实

下面小编就为大家带来一篇正则表达式,替换所有HTML标签的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 我自己写了一个正则表达式,<(. \n)+?> ...

码农般的学良
2016/11/28
152
0
爬虫 | 正则表达式提取腾讯教育新闻链接及图片链接

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzglwh/article/details/80368327 前面的爬虫都是通过标签来爬取的,今天就分享一个小例子使用正则表达式来提...

王亨
2018/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
39分钟前
3
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
40分钟前
5
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
48分钟前
5
1
正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置

正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置 今天要用正则表达式实现匹配一个词出现一次或者不出现的情况,但是又不仅仅是这么简单的需求。先详细说下我这种情况吧,也许有...

Airship
54分钟前
6
0
第八讲:asp.net C# web 读取文件

本讲主要讲解如何在asp.net页面上传文件。 首先,前台页面: 其次,后台页面: 结果: 1、前台效果: 2、后台结果:

刘日辉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部