在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

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

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

    學(xué)習(xí)正則表達(dá)式最好的方式是讀《精通正則表達(dá)式》這本書:

    《精通正則表達(dá)式》

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

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

    如何讀正則表達(dá)式?

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

    所以,學(xué)習(xí)正則表達(dá)式與學(xué)習(xí)其他語(yǔ)言的過程是一樣的,需要學(xué)會(huì)這門語(yǔ)言的詞法語(yǔ)法、語(yǔ)義。如果對(duì)這些詞法、語(yǔ)法、語(yǔ)義不熟悉,看正則表達(dá)式就像天書一樣。

    詞法

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

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

    以下幾個(gè)字符是最最常用的元字符:

    單詞

    詞性

    語(yǔ)義

    ^

    錨點(diǎn)

    以……開頭

    $

    錨點(diǎn)

    以……結(jié)尾

    .

    字符集

    任意字符

    *

    量詞

    任意多個(gè)

    +

    量詞

    1個(gè)或多個(gè)

    ?

    量詞

    0個(gè)或1個(gè)

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

    語(yǔ)法

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

    示例

    舉個(gè)例子:

    /^ab+c*$/

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

    如何寫正則表達(dá)式?

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

    舉個(gè)例子,一個(gè)爬蟲爬取到以下HTML頁(yè)面信息:

  • Home
  • Friends
    • Bob
    • William
    • Vina

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

    /class=”name”/

    還能更簡(jiǎn)潔一些:

    /name/

    或者更具體一些:

    /[^]+/

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

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

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

    如果讓我來寫這個(gè)例子的正則表達(dá)式,我會(huì)傾向于這樣寫:

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

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

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

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

    相關(guān)推薦

    聯(lián)系我們

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