麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Regex > 正文

亂象,印跡 正則學習問答

2020-03-16 21:07:41
字體:
來源:轉載
供稿:網(wǎng)友
在問答過程中,我收集到學習正則表達式過程中的某些普遍問題,在這里專門花一點篇幅來回答
 
 

最近有幸在開源中國和51CTO兩家網(wǎng)站作為嘉賓參與了于正則表達式的專題問答。在問答過程中,我收集到學習正則表達式過程中的某些普遍問題,在這里專門花一點篇幅來回答

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

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

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

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

如果你真正理解了這些常用功能,對它們的價值和使用有清晰的概念,那么另一個麻煩也就迎刃而解了——不同語言的正則表達式不同,如何解決?雖然不同語言中的正則表達式規(guī)定各有不同,但背后的思想是統(tǒng)一的,不同的只是表現(xiàn)形式,或者說概念的落地方式。好處在于,編程語言的文檔不會詳細講解什么是字符組,什么是多選分支,但會詳細告訴你字符組在本語言中是如何表示的,多選分支又是如何表示的(不信你可以在這些文檔中搜索character class或者alternation)。所以如果你的腦子足夠清楚,即便不確定最終的表達式如何寫,也只需要查文檔就可以解決。舉個例子,匹配空白字符的字符組/s,在Java字符串中要寫作//s,因為/s并不是Java字符串中的一個合法轉義序列,所以之前還必須有/來轉義/;在PHP中可以直接寫作/s,因為PHP處理字符串時會把無法識別的轉義序列原封不動地保存下去;在Unix下的某些工具中,必須寫作[[:space:]],這是Perl風格的/s在POSIX規(guī)范中的表示法。看起來比較麻煩,也僅此而已,因為我們知道,這里需要用到的,就是“匹配空白字符的字符組”。

以上寫了這么多,可能有人會說:正則表達式這東西,不登大雅之堂,沒必要花那么多精力。或許正是這種觀點,形成了“不認真學習正則表達式”思想根源。幸運的是,這個問題其實很好想明白,因為很多事情都是這個道理。比如寫文章,我們不要求人人都是作家,但是人人都有可能在需要的時候寫出幾篇拿得出手的正經(jīng)文章,“不是作家”并不是“需要時寫不出正經(jīng)文章”的理由。為了能在需要的時候寫出正經(jīng)文章,就必須專門抽出時間來學習和練習寫作。正則表達式的學習,其實也是這個道理。

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

本文由Yurii原創(chuàng),轉載請注明來源: 亂象,印跡


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 天天透天天狠天天爱综合97 | 蜜桃网站在线观看 | 免费毛片播放 | 欧美黄色大片免费观看 | 北京一级毛片 | 欧美三日本三级少妇三级99观看视频 | 87成人免费看片 | av播放在线| 久久99国产视频 | 国产精品伊人久久 | 91精品国产成人 | 色屁屁xxxxⅹ免费视频 | 小视频免费在线观看 | 天天碰天天操 | 黄色av片在线观看 | 91 视频网站 | 久久久免费观看完整版 | 亚洲欧美不卡视频 | 国产免费一级淫片a级中文 99国产精品自拍 | 91精品国| 精精国产xxxx视频在线野外 | 免费国产一区 | 天堂在线中文资源 | 国产成人高潮免费观看精品 | 久久成人黄色 | 神马顶级推理片免费看 | 国产又粗又爽又深的免费视频 | 国产精品久久久在线观看 | 国产日产精品一区四区介绍 | 国产男女爽爽爽爽爽免费视频 | 黄色羞羞视频在线观看 | 国产一区二区观看 | 欧美伦理一区二区 | 久久免费综合视频 | 黄色免费av| 99成人精品视频 | 蜜桃久久一区二区三区 | 欧美性a视频 | 国产精品手机在线亚洲 | 性生活香蕉视频 | 国产精品久久二区 |