亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                正則表達式應(yīng)該怎么學?

                正則表達式應(yīng)該怎么學?

                學習正則表達式最好的方式是讀《精通正則表達式》這本書:

                《精通正則表達式》

                建議認真學完前6章,后面與具體編程語言相關(guān)的可以跳過?;ㄒ恍r間系統(tǒng)地學習一下正則表達式是非常有好處的。就像張無忌學會九陽神功后學其他武功都特別快,學會正則表達式后再學習UNIX/Linux的下的工具也都特別快!

                除了推薦書籍,我也分享一下我自己讀寫正則表達式的心得。

                如何讀正則表達式?

                《精通正則表達式》這本書讓我認識到,正則表達式只是一種描述字符串長什么樣的聲明式語言,是字符串的元信息。就像SQL是用來描述數(shù)據(jù)長什么樣的聲明式語言,只是SQL使用更直觀的英文單詞作為關(guān)鍵詞,而正則表達式使用的是更加精煉但也更加晦澀的符號字符。

                所以,學習正則表達式與學習其他語言的過程是一樣的,需要學會這門語言的詞法、語法語義。如果對這些詞法、語法、語義不熟悉,看正則表達式就像天書一樣。

                詞法

                前文所述,正則表達式的單詞由標點符號字符組成。和漢語、英語等自然語言一樣,這些單詞也有詞性,包括字符(character)、字符類(character class)、分組(grouping)、量詞(quantifier)、錨點(Anchor)等。

                想要一股腦記住所有符號及其含義,就像從頭到尾背英語詞典一樣,是很低效且痛苦的。好在正則表達式的單詞也符合2-8法則,就像英語里的常用詞一樣并不多,諸如零寬斷言等用法其實不太常用,用到的時候臨時查文檔復習一下用法就行。

                以下幾個字符是最最常用的元字符:

                單詞

                詞性

                語義

                ^

                錨點

                以……開頭

                $

                錨點

                以……結(jié)尾

                .

                字符集

                任意字符

                *

                量詞

                任意多個

                +

                量詞

                1個或多個

                ?

                量詞

                0個或1個

                需要注意的是,除了惰性匹配的量詞,其他量詞默認都是貪心匹配,即盡可能多地匹配、直到無法匹配為止。

                語法

                正則表達式的語法并不多,除了要開閉括號要能一一對應(yīng),也就是量詞只能放在字符、字符集、分組的后面。

                示例

                舉個例子:

                /^ab+c*$/

                模式讀作:“有一些字符串,它們以1個a開頭,緊接著1個或多個b,最后以任意多個c結(jié)尾。”符合這個規(guī)則的字符串很多,有“ab”、“abc”、“abbccc”等等。

                如何寫正則表達式?

                有了前文讀正則表達式的基礎(chǔ),基本上也能照葫蘆畫瓢寫正則表達式了,但新手在寫正則表達式的時候往往容易忽略“上下文”,會寫出非常具體、非常長的模式。因為正則表達式的主要用途就是用于文本匹配,所謂的“上下文”就是正則表達式預(yù)計在那些文本中匹配。上下文不同,解法也可以不同。

                舉個例子,一個爬蟲爬取到以下HTML頁面信息:

              1. Home
              2. Friends
                • Bob
                • William
                • Vina

                假設(shè)希望在這些內(nèi)容中匹配出包含「朋友姓名」的行,比較簡單的方式有:

                /class=”name”/

                還能更簡潔一些:

                /name/

                或者更具體一些:

                /[^]+/

                這三種方式哪種最好呢?這個得視情況而定。我的建議是:

                如果數(shù)據(jù)來源比較可控,例如內(nèi)部系統(tǒng)生成的數(shù)據(jù),則盡量寫簡單有效的模式;

                如果數(shù)據(jù)來源不可控,例如網(wǎng)絡(luò)爬蟲從外部系統(tǒng)抓取的數(shù)據(jù),內(nèi)容隨時都有可能發(fā)生變化,那適度地優(yōu)化一下正則表達式,讓模式具備一些彈性去適應(yīng)可預(yù)見的一些變化。

                如果讓我來寫這個例子的正則表達式,我會傾向于這樣寫:

                /class=”[^”]*bnameb[^”]*”/

                這樣既具備一定的彈性,例如未來添加了其他class,或li換成其他tag,都能自動適應(yīng);又不會過于復雜。

                綜上所述,正則表達式并沒有唯一的標準答案,需要根據(jù)待匹配文本的上下文選擇復雜度最合適的方案。因此,寫正則表達式時不用著急,不必要求自己一次就寫對。應(yīng)該像寫SQL一樣在數(shù)據(jù)集上多select幾次,對數(shù)據(jù)集有了較全面的認知后,不斷修正數(shù)據(jù)過濾條件,就能優(yōu)化出比較精煉的SQL;同樣的,寫正則表達式也是在目標字符串上反復篩選,最后就能優(yōu)化出比較精煉的模式。

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年7月27日 09:22
                下一篇 2022年7月27日 09:22

                相關(guān)推薦

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時間:周一至周五,10:30-18:30,節(jié)假日休息