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