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

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

3天内不再提示

正则表达式实用指南

Q4MP_gh_c472c21 来源:嵌入式软件实战派 作者:实战派小师弟 2020-11-16 15:34 次阅读

正则表达式(Regular Expression,或者Regex),能干嘛?听说很强悍,很多人用来查找字符串,或者替换某些字符串。

实际上,正则表达式有四个功能:

匹配,即查找,例如,从杂乱的一堆文本里面,找到你想要的

替换,按某种规则替换内容

分割,将文本内容按某种规则分割开来

检验,检验某文本是否符合规则

如果没玩过正则表达式,也看不出这四个功能到底能干嘛。

我刚学那阵,觉得这东西,玩点小儿科的东西还行,能干大事?

后来,越用越多,发现这货在你遇到困境的时候可以力挽千钧。

话说回来,这个东西能装逼吗?

1. 你女朋友喊你查她的号码

你女朋友(假如你有)有一天跟你撒娇,她给你一个txt文档,里面存着一个她的号码,让你把她的号码找出来。此时,你不记得她的完整号码了,如果找不出来,晚上就得跪CPU了。刹那间,你想到了,她的号码有这样的数字……771……55(亲亲你……嗯嗯)。于是你,快速用Notepad++打开含有一堆乱七八糟电话号码的文本。查找输入:1d+771d+55,然后回车,Bingo!不信,你试试:

15672846712 13892738409 021-82937465 13263748592 18028374732 010-27384762 13877190955 022-2873625 1324353738 1621723839 38293923 48234934 3123372390 1367282902 1356282920 ......

好吧,故事是虚构的,也别幻想你女朋友真的让你查号码了。

简单解释一下,这里面的d就是表示digital的意思即0-9都可以用d来描述,而d+就表示有多个数字。这个是正则表达式中非常简单的应用了。

2. 查找文件中某字符串内容

模糊搜索到底怎么搞的,你有想过么?要不先来玩下这个,好像有种“万军之中取人头颅如探囊取物”感觉。

例如,你要查找AUTOSAR代码中Os Timer相关的某些函数,这些函数有些特征,带有Os_和Pit的字符,那么你可以用linux上的grep命令或者用vscode的正则表达式功能Os_w+Pitw+来查找。

上面这个w就是匹配word的意思。其实,原理跟上一个例子类似,原理很简单。

实际上,“匹配或者查找”是正则表达式最基本的功能了。

3. 爬取和解析一些不可描述的内容

正则表达式还能不能干点刺激的事情呢?

我有个朋友(别问我朋友是谁,有没有他的联系方式……)。他为了下载某些小视频,硬生生地学会了爬虫,然后,下载了一堆封面图片和一些不可描述的文字描述,还有BT种子,我问他有多少,他说1TB的硬盘快满了……

我问他是怎么做到的,他说他用了BeautifulSoup库来爬的,傻瓜式的,很简单,大有要传授我这些秘技的样子。他还按番号做了分类,每一类番号,还生成一个markdown文本,其中用的最多的就是Regex,例如某类番号可以用ABC-d+筛选出来。

搞完后,他“握草”了好几次,惊叹这个小小的岛国,怎么可以拍这么多这些不可描述的小视频,而且还……(此处省略255个字)

我很好奇,这个爬虫这么好玩?我专门研究了下这个爬虫神器BeautifulSoup,其中很多方法是支持正则表达式的,如re.compile('[a-z]+-[0-9]+',re.I).findall(str_temp)。用起来简直是如虎添翼……

玩归玩,正则表达式在我眼里应该多干些正经事的。

4. 批量格式化处理

我有一堆16进制数,我想用到C代码里面,例如将下面的内容加上0x和逗号,怎么搞?

01234567 89ABCDEF 1011121314151617 18191A1B1C1D1E1F 2021222324252627 28292A2B2C2D2E2F

作为一个很懒的程序员,我肯定不会一个个添加的。试试这个:

查找目标:(w+)[s! ]

替换为:0x1,

(w+)就是那一个个十六进制数,这个括号的作用,就先记录一下,把它放一个分组里面,等下还要用。

[s! ]又是啥玩意?中括号的意思,就是匹配中括号里面任意一个内容,s就是空字符,包括空格、换行符、TAB等。 就是换行啦,而! 呢,非换行咯。整个意思就是,匹配任意不包含换行符的空字符。

下面,这个0x1,中的1就是上面查到的分组的内容。

5. 将数据格式化后复制到Excel

上面的例子有点啰嗦了,看个简单的,有以下数据,想将其中的0x和逗号去掉,并复制到Excel中。

0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,

实际需要分两步:

想将其中的0x和逗号去掉;

复制到Excel中(需要将多余的空格换成Tab字符,才能将多个数值分别填到不同单元格中)。

按照上面的例子,需要:

查找目标:0x(w+),s+

替换为:1

自己领悟一下,哈哈!雕虫小技,还有没有别的?

6. 代码生成与格式化

现有播放器很多个命令,我想将其生成对应的函数,怎么办?

命令:

play pause stop prev next fastforward fastrewind ……

函数:

BOOL player_play_cmd_func(void* p) { } BOOL player_pause_cmd_func(void* p) { } ……

一个个手动敲进去?我这么懒,才不呢。

试试这个:

查找目标:^(w+)$

替换为:BOOL player_1_cmd_func(void* p) { }

好像都很简单啊,有没难一点的啊!

7. 删除不含某些信息的的内容

匹配查找包含某些信息的内容倒是容易,怎么匹配不包含的内容啊?

例如,我想删掉不是.mid后缀的内容,怎么搞?

2009/06/11 05:22 24,253 flourish.mid 2009/06/11 05:24 118,060 ir_begin.wav 2009/06/11 05:24 126,252 ir_end.wav 2009/06/11 05:24 178,732 ir_inter.wav 2009/06/11 05:22 228,396 notify.wav 2009/06/11 05:22 40,075 onestop.mid 2009/06/11 05:22 111,788 recycle.wav 2009/06/11 05:22 88,236 ringout.wav 2009/06/11 05:22 22,097 town.mid

试试这个:

查找目标:^((?!(2009.*.mid$)).)*$

替换为:

看不懂?好好研究下!哈哈哈……

7. 搭上脚本语言的快车

Python、Ruby、Perl、JavaScript上用正则表达式,简直会爽到飞起来……前提你要学会正则表达式各种语法。

这个就不装逼了,以后慢慢玩。

责任编辑:lq

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

    关注

    68

    文章

    10449

    浏览量

    206576
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14177

原文标题:正则表达式装逼(实用)指南

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    你还不会gvim正则表达式?一文搞懂!

    gvim正则表达式常在命令行模式下使用,一般用于文本文件字符串的替换、删除等操作。
    的头像 发表于 01-19 16:47 317次阅读

    GVIM正则表达式介绍和使用示例

    的Ken Thompson借用这个概念并将它应用到了文本编辑器中。后面正则表达式的说法进入到了大家常用的vi、vim、gvim当中。
    的头像 发表于 12-18 15:09 389次阅读
    GVIM<b class='flag-5'>正则表达式</b>介绍和使用示例

    linux正则表达式匹配字符串

    在Linux操作系统中,正则表达式是一种强大的模式匹配工具,它可以用于在文本中查找、替换和筛选特定的字符串。准确掌握正则表达式的语法和常见应用,对于Linux系统的管理员和开发人员来说
    的头像 发表于 11-23 10:26 338次阅读

    什么是正则表达式正则表达式如何工作?哪些语法规则适用正则表达式

    正则表达式又称规则表达式(Regular Expression,在代码中常简写为 regex、regexp 或 RE),是一种用于匹配、查找、替换文本的强大工具。它能够以特定的模式匹配字符串,从而
    的头像 发表于 11-03 14:41 568次阅读
    什么是<b class='flag-5'>正则表达式</b>?<b class='flag-5'>正则表达式</b>如何工作?哪些语法规则适用<b class='flag-5'>正则表达式</b>?

    Java Lambda表达式的新特性

    Java Lambda表达式是Java 8中最重要的新特性之一。 它们是一种可传递的匿名函数,可以作为参数传递给方法或存储在变量中,因此可以在需要的时候调用它们。 基础 1. 简介 Lambda
    的头像 发表于 09-30 10:29 2290次阅读

    怎么去选择使用gm的三种表达式呢?

    我们在写跨导gm的表达式时,知道gm有三种表达式表达式含有的变量其实只有三个,一个W/L,一个Vgs-Vth,还有一个Id。
    的头像 发表于 09-17 15:31 3109次阅读
    怎么去选择使用gm的三种<b class='flag-5'>表达式</b>呢?

    C#模式匹配完全指南

    要使用模式匹配,首先要了解什么是模式。在使用正则表达式匹配字符串时,正则表达式自己就是一个模式,而对字符串使用这段正则表达式进行匹配的过程就是模式匹配。而在代码中也是同样的,我们对对象采用某种模式进行匹配的过程就是模式匹配。
    的头像 发表于 09-13 17:33 276次阅读

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式  Zabbix是一款开源的监控软件,它能通过监控指标来实时监测服务器和网络的运行状态,同时还能提供警报和报告等功能来帮助管理员
    的头像 发表于 08-24 15:50 1216次阅读

    如何使用lambda表达式提升开发效率?

    Java8 的一个大亮点是引入 Lambda 表达式,使用它设计的代码会更加简洁。当开发者在编写 Lambda 表达式时,也会随之被编译成一个函数式接口。
    发表于 08-24 10:25 172次阅读

    Python中的正则表达式

    哈喽大家好,我是了不起,今天给大家讲Python中的正则表达式 在Python中,正则表达式是一种强大的文本处理工具,它可以用来匹配、搜索、替换文本。正则表达式是一个特殊的字符序列,它可以描述一类
    的头像 发表于 06-21 16:52 714次阅读

    OpenHarmony中使用正则表达式

    本文主要介绍笔者在做开源鸿蒙应用开发时,ArkTs 中使用正则表达式处理像 string 等字符串对象。
    的头像 发表于 06-06 09:24 662次阅读

    一文详解Verilog表达式

    表达式由操作符和操作数构成,其目的是根据操作符的意义得到一个计算结果。表达式可以在出现数值的任何地方使用。
    的头像 发表于 05-29 16:23 1939次阅读
    一文详解Verilog<b class='flag-5'>表达式</b>

    shell脚本基础:正则表达式grep

    在Linux上有许多命令可以使用正则表达式,其中最常见的是grep命令和sed命令。正则表达式有多种类型,每种类型中可以使用的元字符类型不同。最常见的是基本正则表达式和扩展正则表达式
    的头像 发表于 05-29 09:29 777次阅读
    shell脚本基础:<b class='flag-5'>正则表达式</b>grep

    KiCad 7中添加网络类(一):通配符与正则表达式

    : 但到7.0版本后,很多小伙伴发现添加网络类没办法手动选择了,只能通过正则表达式来“匹配”需要选择的网络,显得很不方便。 开发者给出的解释是这样可以排除掉大部分自动生成的“匿名”网络,同时让
    发表于 05-24 14:41

    Linux入门之正则表达式

    正则表达式是用来表达字符串匹配模式的方法,利用正则表达式,可以让我们轻易地实现对目标字符串的**查找**、**删除**、**替换**等操作。 正则表达式并不复杂,它并不包含难以理
    的头像 发表于 05-12 15:31 567次阅读
    Linux入门之<b class='flag-5'>正则表达式</b>