0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于正则表达式(regex)的插图指南

m3Fp_almosthuma 来源:机器之心 2020-01-27 11:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

这篇博客是关于正则表达式(regex)的插图指南,旨在为那些从来没有使用过正则表达式,想尝试但又望而生畏的新手提供一个简单介绍。

所以,欢迎使用正则表达式…

对于大多数没有接受过正式 CS 教育的人来说,正则表达式似乎只有最核心的 Unix 程序员才敢碰。

一个好的正则表达式看起来像魔法,但请记住:任何足够先进的技术都无法与魔法区分开来。

所以,就让我们揭开正则表达式的神秘面纱!

如果你理解正则表达式,它会突然变成一个超快速和强大的工具……但你首先需要理解它,老实说,我觉得新手可能会对它望而生畏!

让我们从基础开始。正则表达式(regex)是什么?它们的用途是什么?

Regex 新手上路

本质上来看,正则表达式是定义一种搜索模式的字符序列。

正则表达式通常用于 grep 等工具中,以在较长文本字符串中查找模式。

考虑以下一个 cat.txt 文件:

catcat2dog

如果我们使用正则表达式 cat 来搜索匹配项,我们会找到以下匹配项:

catcat2

高级用户需要注意的是,本文存在一个技术上的错误,即正则表达式和使用正则表达式的工具(如 grep)混为了一谈。

正则表达式适用于字符,而不是单词

需要反复强调的一个重要问题是:正则表达式适用于字符,而不是单词。隐含串联。

如果我们使用正则表达式搜索模式 cat,则不会查找单词「cat」,而会查找字符 c、a 和 t。

点和星号

最基本的字符是单个字符,如 a、b、c 等。现在让我们介绍以下两种特殊的字符。

.(点)字符可以匹配*任何单个字符*。例如,如果我们搜索 c.t,则将匹配从 cat 到 c0t 或 cAt 的任何内容,并将匹配任何单个字符 c +任何字符+单个字符 t。

*(星号)字符有点困难。它修改它前面的字符,然后匹配该字符的*零个或多个字符*。的确如此。例如,cat*可以匹配 cat、catt、cattttt 以及 ca。

示例分析:The cat ate my homework

假设我们逐行读取一个文件,则第一行如下所示:

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] 匹配 0…9 中的任何一个数字

[a-z] 匹配任何小写字母

[A-Z] 匹配任何大写字母

我们还可以对多个字符集进行组合:

[A-ZA-Z0-9] 匹配任何大小写字母和单个数字。

修饰符

此部分内容没有深入展开,以前面遇到的一个修饰符 *(星号)为例。修饰符改变它前面字符的含义。还有很多其他的修饰符,但以* 为例进行讨论是一个很好的开始。

如下所示:让我们快速将文本转储到文件中。

$ echo "The cat jumps long time Then we also have the fact that these are words. 1234 this is a test post please ignore." >> grep.txt

这是现在文件中的内容。

$ cat grep.txtThe cat jumps long timeThen we also have the fact that these are words.1234thisisatestpostpleaseignore.

寻找 cat。

$ grep "cat" grep.txtThe cat jumps long time

寻找任何以数字^[0-9] 开始的任意行。

$ grep "^[0-9]" grep.txt1234 this is a test post please ignore.

就是这样!你刚刚使用了正则表达式。太棒了。

总结

回顾一下这篇博客的内容:

正则表达式的基本功能;

正则表达式的三个主要组件:锚点、字符集和修饰符。

.(点)、*(星号)、^(插入符)和$(美元符号)。

一些字符集 [0-9]、[a-z]、[A-Z] 和它们的组合。

这篇博客的目的是通过带插图的介绍使用户更轻松地了解正则表达式。

如果能够克服技术上的困难,则最终可以掌握这种相对简单但功能却很强大的正则表达式工具,从而为任何数据科学家带来宝贵的价值。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符
    +关注

    关注

    0

    文章

    237

    浏览量

    26055
  • 正则表达式
    +关注

    关注

    0

    文章

    28

    浏览量

    3815

原文标题:新手上路:图文解读助你理解和使用正则表达式

文章出处:【微信号:almosthuman2014,微信公众号:机器之心】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    第4章 C语言基础以及流水灯的实现(4.5 4.6)

    (表达式)        {            循环体语句;        } 在C语言里,通常“表达式”符合条件叫做真,不符合条件,叫做假。比如前边i while(表达式)这个括号里的
    的头像 发表于 11-06 11:21 118次阅读

    inline ASM(内联汇编)的细节分享

    内联汇编,否则,仍然是带有C++表达式的内联江编,此时\"instructionlist\"中的寄存器的写法需要遵守相关的规定: 寄存器前必须使用两个百分号(%%),而不是像
    发表于 10-31 09:11

    I1电流计算对不对?怎么推导不出来I1的表达式是图中那样

    I1电流计算对不对?怎么推导不出来I1的表达式是图中那样
    发表于 09-28 18:01

    labview如何使用VISA串口资源查找的正则表达式提取串口的资源名称?

    如图,如何利用VISA资源查找的正则表达式从很多串口当中提取想要的目标串口(Quectel USB AT Port这个串口)?
    发表于 07-07 17:20

    基础篇3:掌握Python中的条件语句与循环

    不同的条件执行不同的代码块。Python中的条件语句主要使用if、elif(else if的缩写)和else关键字。 if语句 最简单的条件语句是if语句,它的工作方式如下: 复制代码 if 条件表达式
    发表于 07-03 16:13

    Cubeide1.18.1在线调试改变\"现场表达式\"中的值提示找不到地址,为什么?

    Cubeide1.18.1在线调试时,在\"现场表达式\"中添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 06-12 06:50

    《ESP32S3 Arduino开发指南》第三章 C/C++语言基础

    基础,由于篇幅有限,在此仅对C/C++语言基础进行简单介绍。本章将分为如下9个小节:3.1 数据类型3.2 运算符3.3 表达式3.4 数组3.5 字符串3.6 注释3.7 顺序结构3.8 选择结构
    发表于 06-10 09:20

    Cubeide1.18.1在线调试改变\"现场表达式\"中的值提示找不到地址是怎么回事?

    Cubeide1.18.1在线调试时,在\"现场表达式\"中添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 06-10 08:26

    干货分享 | 零基础上手!TSMaster图形信号表达式实操指南

    TSMaster软件支持在图形里面的信号表达式功能,主要用于多信号表达式运算和显示的场景。本文将以A2L中的标定变量为例,介绍如何使用图形中的信号表达式功能进行多信号的后处理运算和显示。本文关键词
    的头像 发表于 06-06 20:03 676次阅读
    干货分享 | 零基础上手!TSMaster图形信号<b class='flag-5'>表达式</b>实操<b class='flag-5'>指南</b>

    Cubeide1.18.1在线调试改变\"现场表达式\"中的值提示找不到地址,怎么解决?

    Cubeide1.18.1在线调试时,在\"现场表达式\"中添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 06-06 08:27

    Cubeide1.18.1在线调试改变\"现场表达式\"中的值提示找不到地址怎么解决?

    Cubeide1.18.1在线调试时,在\"现场表达式\"中添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 04-27 06:18

    Linux中文本处理命令的用法

    Linux 三剑客是(grep,sed,awk)三者的简称,熟练使用这三个工具可以提升运维效率。Linux 三剑客以正则表达式作为基础,而在Linux系统中,支持两种正则表达式,分别为“标准正则表达式”和“扩展
    的头像 发表于 04-15 10:22 558次阅读
    Linux中文本处理命令的用法

    HarmonyOS NEXT 原生应用/元服务-ArkTS代码调试Evaluate and log

    开发者可以通过 Evaluate and log 能力在代码执行到断点行时打印开发者指定的表达式。 操作步骤 在需要打印表达式结果的地方设置断点。 右键断点,然后点击More按钮。 勾选
    发表于 03-14 16:49

    利用栈结构实现四则运算的巧妙方法

    上个视频写了个简易计算器,算个简单的加减乘除还行,但是如果来个混合运算,或者加个括号,这几行代码就差的太多了。 处理这种混合运算,不得不提到数据结构中的栈。 我们平时写的这种表达式,叫做中缀表达式
    的头像 发表于 02-07 11:06 976次阅读

    Linux grep命令详解

    Linux grep命令是一种非常常用的文本搜索工具,它可以在给定的文件中搜索匹配的字符串,并输出匹配的行。grep是全称“global search regular expression print”,可以识别正则表达式,并使用正则表达式进行搜索。
    的头像 发表于 12-25 09:39 1797次阅读