正则表达式装逼(实用)指南


正则表达式 实用指南

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

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

  1. 匹配,即查找,例如,从杂乱的一堆文本里面,找到你想要的
  2. 替换,按某种规则替换内容
  3. 分割,将文本内容按某种规则分割开来
  4. 检验,检验某文本是否符合规则

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

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

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dE3ItlIS-1603453185356)(en-resource://database/2596:1)]

上面这个\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和逗号,怎么搞?

0	1	2	3	4	5	6	7	
8	9	A	B	C	D	E	F
10	11	12	13	14	15	16	17	
18	19	1A	1B	1C	1D	1E	1F
20	21	22	23	24	25	26	27	
28	29	2A	2B	2C	2D	2E	2F

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

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

替换为:0x\1,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OOix18sJ-1603453185358)(image-20201022223101575.png)]

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

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

下面,这个0x\1,中的\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,  

实际需要分两步:

  1. 想将其中的0x和逗号去掉;
  2. 复制到Excel中(需要将多余的空格换成Tab字符,才能将多个数值分别填到不同单元格中)。

按照上面的例子,需要:

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

替换为:\1\t

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uit2iI0J-1603453185362)(image-20201022224500430.png)]

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

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\)\n{\n\n}\n

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-86anyBWx-1603453185364)(image-20201022225532702.png)]

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

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$)).)*$

替换为:

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

8. 搭上脚本语言的快车

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

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

关注“嵌入式软件实战派”,我给你讲更多关于装逼实用的故事。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值