當前位置:首頁 > 公眾號精選 > 嵌入式微處理器
[導讀]正則表達式(Regular Expression,或者Regex),能干嘛?聽說很強悍,很多人用來查找字符串,或者替換某些字符串。實際上,正則表達式有四個功能: 匹配、替換、分割、檢驗。

正則表達式(Regular Expression,或者Regex),能干嘛?聽說很強悍,很多人用來查找字符串,或者替換某些字符串。

實際上,正則表達式有四個功能:

  1. 匹配,即查找,例如,從雜亂的一堆文本里面,找到你想要的

  2. 替換,按某種規(guī)則替換內容

  3. 分割,將文本內容按某種規(guī)則分割開來

  4. 檢驗,檢驗某文本是否符合規(guī)則

如果沒玩過正則表達式,也看不出這四個功能到底能干嘛。

我剛學那陣,覺得這東西,玩點小兒科的東西還行,能干大事?

后來,越用越多,發(fā)現這貨在你遇到困境的時候可以力挽千鈞。

話說回來,這個東西能裝逼嗎?

1. 你女朋友喊你查她的號碼

你女朋友(假如你有)有一天跟你撒嬌,她給你一個txt文檔,里面存著一個她的號碼,讓你把她的號碼找出來。此時,你不記得她的完整號碼了,如果找不出來,晚上就得跪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+來查找。

上面這個\w就是匹配word的意思。其實,原理跟上一個例子類似,原理很簡單。

實際上,“匹配或者查找”是正則表達式最基本的功能了。

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

正則表達式還能不能干點刺激的事情呢?

我有個朋友(別問我朋友是誰,有沒有他的聯(lián)系方式……)。他為了下載某些小視頻,硬生生地學會了爬蟲,然后,下載了一堆封面圖片和一些不可描述的文字描述,還有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!\n]

替換為:0x\1,


(\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

自己領悟一下,哈哈!雕蟲小技,還有沒有別的?

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

好像都很簡單啊,有沒難一點的??!

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上用正則表達式,簡直會爽到飛起來……前提你要學會正則表達式各種語法。

這個就不裝逼了,以后慢慢玩。

-END-


來源 | 嵌入式軟件實戰(zhàn)派

作者 |?實戰(zhàn)派小師弟


|?整理文章為傳播相關技術,版權歸原作者所有?|

|?如有侵權,請聯(lián)系刪除?|


【1】超長干貨為你解析:從串口驅動到Linux驅動模型,嵌入式必會!

【2】超全!嵌入式必懂的CAN總線一文講通了

【3】干貨:嵌入式系統(tǒng)設計開發(fā)大全?。ㄈf字總結)

【4】嵌入式系統(tǒng)求職回憶錄:廣嵌、邁瑞、華為、智光……

【5】嵌入式行業(yè)真的沒有前途嗎?



免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關注更多精彩內容

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉