正則表達(dá)式(Regular Expression,或者Regex),能干嘛?聽說很強(qiáng)悍,很多人用來查找字符串,或者替換某些字符串。
實(shí)際上,正則表達(dá)式有四個(gè)功能:
匹配,即查找,例如,從雜亂的一堆文本里面,找到你想要的
替換,按某種規(guī)則替換內(nèi)容
分割,將文本內(nèi)容按某種規(guī)則分割開來
檢驗(yàn),檢驗(yàn)?zāi)澄谋臼欠穹弦?guī)則
如果沒玩過正則表達(dá)式,也看不出這四個(gè)功能到底能干嘛。
我剛學(xué)那陣,覺得這東西,玩點(diǎn)小兒科的東西還行,能干大事?
后來,越用越多,發(fā)現(xiàn)這貨在你遇到困境的時(shí)候可以力挽千鈞。
話說回來,這個(gè)東西能裝逼嗎?
1. 你女朋友喊你查她的號(hào)碼
你女朋友(假如你有)有一天跟你撒嬌,她給你一個(gè)txt文檔,里面存著一個(gè)她的號(hào)碼,讓你把她的號(hào)碼找出來。此時(shí),你不記得她的完整號(hào)碼了,如果找不出來,晚上就得跪CPU了。剎那間,你想到了,她的號(hào)碼有這樣的數(shù)字……771……55(親親你……嗯嗯)。于是你,快速用Notepad++打開含有一堆亂七八糟電話號(hào)碼的文本。查找輸入:1d+771d+55,然后回車,Bingo!不信,你試試:
15672846712 13892738409 021-82937465 13263748592 18028374732 010-27384762 13877190955 022-2873625 1324353738 1621723839 38293923 48234934 3123372390 1367282902 1356282920 ......
好吧,故事是虛構(gòu)的,也別幻想你女朋友真的讓你查號(hào)碼了。
簡(jiǎn)單解釋一下,這里面的d就是表示digital的意思即0-9都可以用d來描述,而d+就表示有多個(gè)數(shù)字。這個(gè)是正則表達(dá)式中非常簡(jiǎn)單的應(yīng)用了。
2. 查找文件中某字符串內(nèi)容
模糊搜索到底怎么搞的,你有想過么?要不先來玩下這個(gè),好像有種“萬軍之中取人頭顱如探囊取物”感覺。
例如,你要查找AUTOSAR代碼中Os Timer相關(guān)的某些函數(shù),這些函數(shù)有些特征,帶有Os_和Pit的字符,那么你可以用linux上的grep命令或者用vscode的正則表達(dá)式功能Os_w+Pitw+來查找。
上面這個(gè)w就是匹配word的意思。其實(shí),原理跟上一個(gè)例子類似,原理很簡(jiǎn)單。
實(shí)際上,“匹配或者查找”是正則表達(dá)式最基本的功能了。
3. 爬取和解析一些不可描述的內(nèi)容
正則表達(dá)式還能不能干點(diǎn)刺激的事情呢?
我有個(gè)朋友(別問我朋友是誰,有沒有他的聯(lián)系方式……)。他為了下載某些小視頻,硬生生地學(xué)會(huì)了爬蟲,然后,下載了一堆封面圖片和一些不可描述的文字描述,還有BT種子,我問他有多少,他說1TB的硬盤快滿了……
我問他是怎么做到的,他說他用了BeautifulSoup庫(kù)來爬的,傻瓜式的,很簡(jiǎn)單,大有要傳授我這些秘技的樣子。他還按番號(hào)做了分類,每一類番號(hào),還生成一個(gè)markdown文本,其中用的最多的就是Regex,例如某類番號(hào)可以用ABC-d+篩選出來。
搞完后,他“握草”了好幾次,驚嘆這個(gè)小小的島國(guó),怎么可以拍這么多這些不可描述的小視頻,而且還……(此處省略255個(gè)字)
我很好奇,這個(gè)爬蟲這么好玩?我專門研究了下這個(gè)爬蟲神器BeautifulSoup,其中很多方法是支持正則表達(dá)式的,如re.compile('[a-z]+-[0-9]+',re.I).findall(str_temp)。用起來簡(jiǎn)直是如虎添翼……
玩歸玩,正則表達(dá)式在我眼里應(yīng)該多干些正經(jīng)事的。
4. 批量格式化處理
我有一堆16進(jìn)制數(shù),我想用到C代碼里面,例如將下面的內(nèi)容加上0x和逗號(hào),怎么搞?
01234567 89ABCDEF 1011121314151617 18191A1B1C1D1E1F 2021222324252627 28292A2B2C2D2E2F
作為一個(gè)很懶的程序員,我肯定不會(huì)一個(gè)個(gè)添加的。試試這個(gè):
查找目標(biāo):(w+)[s! ]
替換為:0x1,
(w+)就是那一個(gè)個(gè)十六進(jìn)制數(shù),這個(gè)括號(hào)的作用,就先記錄一下,把它放一個(gè)分組里面,等下還要用。
[s! ]又是啥玩意?中括號(hào)的意思,就是匹配中括號(hào)里面任意一個(gè)內(nèi)容,s就是空字符,包括空格、換行符、TAB等。 就是換行啦,而! 呢,非換行咯。整個(gè)意思就是,匹配任意不包含換行符的空字符。
下面,這個(gè)0x1,中的1就是上面查到的分組的內(nèi)容。
5. 將數(shù)據(jù)格式化后復(fù)制到Excel
上面的例子有點(diǎn)啰嗦了,看個(gè)簡(jiǎn)單的,有以下數(shù)據(jù),想將其中的0x和逗號(hào)去掉,并復(fù)制到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,
實(shí)際需要分兩步:
想將其中的0x和逗號(hào)去掉;
復(fù)制到Excel中(需要將多余的空格換成Tab字符,才能將多個(gè)數(shù)值分別填到不同單元格中)。
按照上面的例子,需要:
查找目標(biāo):0x(w+),s+
替換為:1
自己領(lǐng)悟一下,哈哈!雕蟲小技,還有沒有別的?
6. 代碼生成與格式化
現(xiàn)有播放器很多個(gè)命令,我想將其生成對(duì)應(yīng)的函數(shù),怎么辦?
命令:
play pause stop prev next fastforward fastrewind ……
函數(shù):
BOOL player_play_cmd_func(void* p) { } BOOL player_pause_cmd_func(void* p) { } ……
一個(gè)個(gè)手動(dòng)敲進(jìn)去?我這么懶,才不呢。
試試這個(gè):
查找目標(biāo):^(w+)$
替換為:BOOL player_1_cmd_func(void* p) { }
好像都很簡(jiǎn)單啊,有沒難一點(diǎn)的?。?/p>
7. 刪除不含某些信息的的內(nèi)容
匹配查找包含某些信息的內(nèi)容倒是容易,怎么匹配不包含的內(nèi)容???
例如,我想刪掉不是.mid后綴的內(nèi)容,怎么搞?
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
試試這個(gè):
查找目標(biāo):^((?!(2009.*.mid$)).)*$
替換為:
看不懂?好好研究下!哈哈哈……
7. 搭上腳本語言的快車
在Python、Ruby、Perl、JavaScript上用正則表達(dá)式,簡(jiǎn)直會(huì)爽到飛起來……前提你要學(xué)會(huì)正則表達(dá)式各種語法。
這個(gè)就不裝逼了,以后慢慢玩。
責(zé)任編輯:lq
-
cpu
+關(guān)注
關(guān)注
68文章
10863瀏覽量
211799 -
C代碼
+關(guān)注
關(guān)注
1文章
89瀏覽量
14304
原文標(biāo)題:正則表達(dá)式裝逼(實(shí)用)指南
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論