為什么一定要掌握
作為正則表達式,優(yōu)勢有:
- 簡潔
- 力量強大
- 文本處理軍刀
同樣,劣勢明顯:
- 難讀
- 難寫
- 難維護
- 只在小范圍用
那為什么還要它?原因是:
- 你繞不過,代碼里會遇到它,你需要攻破這一知識點
- 它總是在撩你
- 掌握它,收益巨大
它是什么
- 文本利器,其他領(lǐng)域沒有用
- 能讓你的效率提升的神器
- 標準混亂,哦不,沒有標準,總體以「Perl風格」為標準
工欲善其事,必先利其器也
赤手空拳上戰(zhàn)場的士兵是不可理喻的
書籍:
-
<<精通正則表達式>>, 只此一本,從此能上天!(BTW,后面語言相關(guān)部分可以只看自己喜愛的語言那里,其他可跳過)拒絕網(wǎng)上的那些不嚴謹,廢話多的,轉(zhuǎn)述文檔的,或者純粹總結(jié)某某書籍的,沒用的垃圾教程什么也比不上自己看經(jīng)典書籍靠譜!
匹配工具,必須能
即時高亮搜索即時高亮匹配- 支持多種語言
- 主流正則標準支持完備
所以,你需要:
- 拒絕所謂網(wǎng)頁版; 拒絕不能
即時的,高亮的(不是針對誰,只是在座的各位都是...) -
Sublime,它的搜索框勉強滿足上面要求,推薦 -
RegexBuddy(Windows版),神器! 有它,足矣!
我認為「稱得上重要的」正則語法
心法也
[數(shù)量詞/范圍]
-
*: 任意數(shù)量任意字符 -
+: 嚴格地任意數(shù)量任意字符(其實是大于等于1個,但是這樣好記憶) -
?: 0或1個任意字符 -
.: 一個任意字符(按理來說不歸為此類,但是我覺得應該這樣) -
{start,end}:A{1,} A{1,10} A{,10}
[邏輯]
-
|: 或,只用于元組內(nèi) -
^: 非,只用于字符集內(nèi)
[類似集合的東東]
-
[]: 字符集.幾點注意:-
^的位置,^a-b與a^b能理解嗎 -
-的位置,a-z與-az意思完全不同
-
-
(): 元組,(A|B|C|D)能理解嗎
[殺器功能]
-
環(huán)視,或者說
錨點,本身不匹配任何字符,只標記一個地方-
約定的:^$ -
正向肯定:(?=...) - 正向否定: (?<=...)
-
逆向肯定:(?!...) - 逆向否定: (?<!...)
- 以上,只要兩個就夠了!因為:
否定就是肯定,否定用^符號輔助不就行了?又丟掉一點點心智負擔
-
-
元組命名,好用且有用,各家編程語言不同,有的還不支持,下面以Python為例-
(?P<name>...): 唔...,還挺漂亮的
-
-
后向引用, 就是用前面已經(jīng)匹配的內(nèi)容,這時正好用到上面元組命名功能,總得知道前面已經(jīng)匹配的一坨東西是啥吧,以Python為例- (?=...)
[所謂約定俗成的,看起來重要的字符集]
- 無非是
\w,\d這些啦,有了上面的語法,這些東西自己要能在腦海里組裝起來,這樣記憶起來負擔小 - 幾個重要的
-
\w:[a-zA-Z_] -
\b:((?<!\w)(?=\w)|(?!\w)(?=\w))
-
[其他]
都是各家語言提供的方言功能了吧,可能,不學也罷
練習!練習!練習!
- 與之相關(guān)的工具:
grep,awk等,各語言的正則庫,其中語言正則庫最重要,必須通讀其文檔,才能心中有正氣 - 平時有事沒事粘貼東西到Sublime中,
搜索/替換(不管是實際需求,還是自己捏造的) - 常用的正則,至少看懂.如
匹配url,email等