a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > Regex > 正文

亂象,印跡 正則學(xué)習(xí)問(wèn)答

2020-03-16 21:07:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
在問(wèn)答過(guò)程中,我收集到學(xué)習(xí)正則表達(dá)式過(guò)程中的某些普遍問(wèn)題,在這里專(zhuān)門(mén)花一點(diǎn)篇幅來(lái)回答
 
 

最近有幸在開(kāi)源中國(guó)和51CTO兩家網(wǎng)站作為嘉賓參與了于正則表達(dá)式的專(zhuān)題問(wèn)答。在問(wèn)答過(guò)程中,我收集到學(xué)習(xí)正則表達(dá)式過(guò)程中的某些普遍問(wèn)題,在這里專(zhuān)門(mén)花一點(diǎn)篇幅來(lái)回答

正則表達(dá)式是難學(xué)的,這不存在疑義。但是我認(rèn)為,難點(diǎn)也只在語(yǔ)法方面。正則表達(dá)式已經(jīng)有年頭了,它(的語(yǔ)法)誕生于上世紀(jì)七十年代。那是個(gè)怎樣的情景?舉個(gè)簡(jiǎn)單的例子吧,Unix下的usrdev等名字,就是那時(shí)留傳下來(lái)的,現(xiàn)在已經(jīng)有很多人詬病了,usr不是user,dev不是device,難學(xué),也難記。經(jīng)過(guò)這些年的飛速發(fā)展,當(dāng)年的很多問(wèn)題已經(jīng)被包裝得美輪美奐,如今的用戶(hù)可能更習(xí)慣直接點(diǎn)擊“用戶(hù)目錄”、“驅(qū)動(dòng)器”之類(lèi)的圖標(biāo),再也不用為那些不規(guī)則的簡(jiǎn)短名字發(fā)愁。但是不幸的是,一直以來(lái)正則表達(dá)式的語(yǔ)法卻沒(méi)有太多的變化,甚至后續(xù)增加的功能,也沿襲了之前的語(yǔ)法風(fēng)格,在編程語(yǔ)言日漸人性化的今天,它自然顯得非常難懂了。今天的開(kāi)發(fā)人員可能更習(xí)慣Regex.CharRange(‘a', ‘z')這樣的寫(xiě)法,而不習(xí)慣[a-z];遇到(?![a-z])這樣的結(jié)構(gòu)就更是抓瞎,除非轉(zhuǎn)為Regex.CheckRight(Regex.CharRange(‘a', ‘z'))的寫(xiě)法。

不過(guò),換一個(gè)角度來(lái)看,兩者其實(shí)是一回事,只是表現(xiàn)形式不同,一個(gè)類(lèi)似要訣,一個(gè)類(lèi)似大白話。如果我們能在頭腦里構(gòu)建出從要訣到大白話的轉(zhuǎn)換,正則表達(dá)式就簡(jiǎn)單了許多,甚至可以說(shuō)就是模塊的拼接。比如支付寶的流水號(hào)為18或26位數(shù)字,用正則表達(dá)式匹配,就是^([0-9]{18}|[0-9]{26})$,或者^[0-9]{18}([0-9]{8})?$。其中的邏輯很簡(jiǎn)單:^用來(lái)鎖定開(kāi)頭,$用來(lái)鎖定結(jié)尾,[0-9]匹配數(shù)字字符,([0-9]{18}|[0-9]{26})表示兩個(gè)并列的選項(xiàng),即數(shù)字字符串長(zhǎng)度為18位或26位,而[0-9]{18}([0-9]{8})?表示至少需要出現(xiàn)18位的數(shù)字字符串,在這之后可能還有一個(gè)8位的數(shù)字字符串(所以總長(zhǎng)度是26位)。一般的正則表達(dá)式應(yīng)用,就是這么簡(jiǎn)單。

如果你覺(jué)得上面說(shuō)的沒(méi)錯(cuò),那么學(xué)習(xí)正則表達(dá)式的難題就只剩下了選擇得當(dāng)?shù)姆椒āN覀儗W(xué)習(xí)編程語(yǔ)言時(shí),都強(qiáng)調(diào)不能只看書(shū),要?jiǎng)邮謱?xiě)程序,甚至最好的辦法是把書(shū)上的例子親自輸入運(yùn)行一遍,這樣才算真正學(xué)會(huì)了。但在許多人眼里,正則表達(dá)式或許算不上編程語(yǔ)言,所以學(xué)習(xí)是點(diǎn)到即止,甚至是滿(mǎn)足于從網(wǎng)絡(luò)上抄一些現(xiàn)成的表達(dá)式。所以,常見(jiàn)的問(wèn)題之一是“有沒(méi)有什么學(xué)習(xí)的捷徑”,很不幸,答案是沒(méi)有——既然拷貝他人的代碼不能學(xué)會(huì)編程,抄閱現(xiàn)成的表達(dá)式、隨便翻幾篇文檔,當(dāng)然也學(xué)不會(huì)正則。不過(guò)也有幸運(yùn)的消息,真正學(xué)會(huì)正則表達(dá)式并不需要花太長(zhǎng)的時(shí)間。

以我的經(jīng)驗(yàn),學(xué)習(xí)正則表達(dá)式,真正要做的是深入理解常用功能:字符組、多選分支、匹配模式、環(huán)視。可以說(shuō),弄明白了這幾點(diǎn),80%的正則問(wèn)題都可以解決。但是要弄明白這幾點(diǎn),就需要專(zhuān)門(mén)的學(xué)習(xí):字符組是解決什么問(wèn)題的,它是怎么使用的?多選分支是解決什么問(wèn)題的,它是怎么使用的?應(yīng)當(dāng)抽一些時(shí)間專(zhuān)門(mén)學(xué)習(xí)、思考;這些都弄明白了,再研究解決復(fù)雜問(wèn)題的表達(dá)式是怎么構(gòu)成的。如果你可以每天抽1-2小時(shí)專(zhuān)門(mén)學(xué)習(xí),兩周內(nèi)就會(huì)有明顯收效,一個(gè)月幾乎就可以修煉到相當(dāng)水平。而且,以我的經(jīng)驗(yàn),在學(xué)習(xí)新的編程語(yǔ)言時(shí),不但要把書(shū)上的例子都親自輸入運(yùn)行一遍,更要自己動(dòng)手去改一改示例代碼,看看會(huì)出現(xiàn)什么現(xiàn)象,再想想為什么會(huì)這樣。如果你在學(xué)習(xí)正則表達(dá)式時(shí)也做到這一點(diǎn),必然能夠事半功倍。

如果你真正理解了這些常用功能,對(duì)它們的價(jià)值和使用有清晰的概念,那么另一個(gè)麻煩也就迎刃而解了——不同語(yǔ)言的正則表達(dá)式不同,如何解決?雖然不同語(yǔ)言中的正則表達(dá)式規(guī)定各有不同,但背后的思想是統(tǒng)一的,不同的只是表現(xiàn)形式,或者說(shuō)概念的落地方式。好處在于,編程語(yǔ)言的文檔不會(huì)詳細(xì)講解什么是字符組,什么是多選分支,但會(huì)詳細(xì)告訴你字符組在本語(yǔ)言中是如何表示的,多選分支又是如何表示的(不信你可以在這些文檔中搜索character class或者alternation)。所以如果你的腦子足夠清楚,即便不確定最終的表達(dá)式如何寫(xiě),也只需要查文檔就可以解決。舉個(gè)例子,匹配空白字符的字符組/s,在Java字符串中要寫(xiě)作//s,因?yàn)?span id="6awe2wmou" class="code" style="font-family: AndaleMono, LucidaConsole, monospace; white-space: nowrap;">/s并不是Java字符串中的一個(gè)合法轉(zhuǎn)義序列,所以之前還必須有/來(lái)轉(zhuǎn)義/;在PHP中可以直接寫(xiě)作/s,因?yàn)镻HP處理字符串時(shí)會(huì)把無(wú)法識(shí)別的轉(zhuǎn)義序列原封不動(dòng)地保存下去;在Unix下的某些工具中,必須寫(xiě)作[[:space:]],這是Perl風(fēng)格的/s在POSIX規(guī)范中的表示法。看起來(lái)比較麻煩,也僅此而已,因?yàn)槲覀冎溃@里需要用到的,就是“匹配空白字符的字符組”。

以上寫(xiě)了這么多,可能有人會(huì)說(shuō):正則表達(dá)式這東西,不登大雅之堂,沒(méi)必要花那么多精力。或許正是這種觀點(diǎn),形成了“不認(rèn)真學(xué)習(xí)正則表達(dá)式”思想根源。幸運(yùn)的是,這個(gè)問(wèn)題其實(shí)很好想明白,因?yàn)楹芏嗍虑槎际沁@個(gè)道理。比如寫(xiě)文章,我們不要求人人都是作家,但是人人都有可能在需要的時(shí)候?qū)懗鰩灼玫贸鍪值恼?jīng)文章,“不是作家”并不是“需要時(shí)寫(xiě)不出正經(jīng)文章”的理由。為了能在需要的時(shí)候?qū)懗稣?jīng)文章,就必須專(zhuān)門(mén)抽出時(shí)間來(lái)學(xué)習(xí)和練習(xí)寫(xiě)作。正則表達(dá)式的學(xué)習(xí),其實(shí)也是這個(gè)道理。

這種說(shuō)法可以說(shuō)服一些人,但還有一些人是說(shuō)服不了的。同時(shí)據(jù)我觀察,那些不能被說(shuō)服的人,似乎也沒(méi)有花太多精力在其它“正事”上,反而會(huì)不時(shí)為正則表達(dá)式所困擾。與此相反的是,真正有職業(yè)素質(zhì)的程序員,就像the Productive Programmer中說(shuō)的那樣,會(huì)愿意花2小時(shí)寫(xiě)出一個(gè)正則表達(dá)式,為以后節(jié)省無(wú)窮無(wú)盡的時(shí)間。當(dāng)然,以上說(shuō)的這一切的前提,都是能端正學(xué)習(xí)正則表達(dá)式,或者說(shuō)學(xué)習(xí)有價(jià)值技能的的態(tài)度。做軟件的人大都讀過(guò)布魯克斯的名文《沒(méi)有銀彈》,所以這里不妨借用他的話說(shuō),正則表達(dá)式的學(xué)習(xí),也不存在銀彈。

本文由Yurii原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)源: 亂象,印跡


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲永久免费 | www.日本视频 | 国产精品theporn| 国产精品一区二区无线 | 日韩手机在线 | 91一区 | 九九精品视频在线观看 | 国产精品国产三级国产aⅴ中文 | 污网站在线播放 | 久久久久久久久久久久久九 | 成人在线| 久久久久久久久久影院 | 青青久久久 | 日本黄色影片在线观看 | 欧美成人一区二免费视频软件 | 欧美国产日韩一区 | 亚州av在线| 国产v在线| 色视频免费在线观看 | 十八岁禁看网站 | 国产精品毛片 | 久久国产精品99久久久久久牛牛 | 国产精品中文字幕在线观看 | 久久靠逼| 天堂999| 国产精品美女久久久 | 日日骑夜夜操 | 热久久久 | 久草免费在线 | 日韩av黄色| 日本黄色一级片免费看 | 久久人人爽爽人人爽人人片av | 久久综合久久久 | 日韩视频中文字幕 | 久久久久国| 性视频网站免费 | 日韩av入口| 国产精品1区2区 | 99精品亚洲国产精品久久不卡 | 日韩精品1区2区 | 日本在线观看一区二区 |