正則表達式(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
+關注
關注
68文章
10826瀏覽量
211160 -
C代碼
+關注
關注
1文章
89瀏覽量
14287
原文標題:正則表達式裝逼(實用)指南
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論