序
克制我們內心的衝動
《正規表示法》(第2版)就要出版了,本來這是個好消息。在這之前,我更想做的是克制自己內心的衝動,靜下心來講講這本書的故事。
《正規表示法》初版剛出版的時候,我一度認為,自己和正規表示法的緣分到此為止了。如果說翻譯《精通正規表示法》之後還有許多遺憾,比如某些講解方式不符合華語程式師的思維,以及過份關注英文,所以關於東亞文字處理的知識無從尋找,經驗無從分享。那麼寫作《正規表示法》,就是彌補這種缺憾的絕好機會。《正規表示法》面世之後,這些缺憾已經悉數補上了。
令我沒有想到的是,《正規表示法》自2012年出版以來,不斷有讀者向我回饋問題。除去最早一兩年密集熱烈的回饋,後續的回饋如涓涓細流綿綿不絕。而我一度想當然地認為勘誤已經完整了,所以一直沒檢查勘誤信箱。直到一年前讀者在微信公眾號後台給我留言,詳細列明勘誤意見之外,毫不留情地指責「對自己的作品不負責,長期不回覆讀者意見」。這封信讓我慚愧不已。在軟體發展中,「發佈了就不管」是很不負責的,在技術書籍的寫作中,「出版了兩年就不回覆讀者意見」,同樣是很不負責的。
所以,我必須克制自己內心「年代久遠,不值得繼續打理」的偷懶衝動。文責自負,完整的說法應該是「文責終身自負」。
本次《正規表示法》(第2版)的出版,對我而言是全新的彌補機會,可以「一次性」回覆迄今為止所有的讀者意見。當然,新增的Objective-C、Golang等章節,儘管已經找熟悉的朋友審讀過,但我可以肯定,它們必定不是完美無瑕的,未來仍然需要坦然面對廣大讀者持續的批評指正。哪怕有些批評指正的語氣不那麼讓人舒服,甚至「看不到幾分善意」,我仍然需要克制自己內心「反唇相譏」的衝動,認清事實,撇開情緒,虛心面對。
同時,我也希望讀者在閱讀這本書時,能克制自己內心的衝動。
我希望大家克制的第一重衝動,是淺嘗輒止—「正規運算式這玩意兒,要用時翻翻就好,沒必要深究」。正規運算式已經誕生很多年了,以今天的標準來看,它的語法和結構相當粗陋,不幸的是,它的內部邏輯又相當複雜。有些朋友會問我一些「怎麼看也看不懂」的正規運算式,坦白地說,我也要反復琢磨才能看懂。所以,儘管這本書提供了若干「速查」資料,但我還是建議讀者能耐下心來,至少通讀一遍。正規運算式有點像游泳,學會了就不會忘,用的時候自然能想起來。否則,你永遠只能在岸邊撲騰,離開了其他人的協助,一步都不敢往深處去。雖然很多時候,與你要的東西就只有一步之遙。
我希望大家克制的第二重衝動,是玩弄正規表示法的快感。前面說過,正規運算式的語法和結構相當粗陋,內部邏輯又相當複雜,所以不少人學會之後,產生了「掌握神奇魔咒」的快感。凡是和字串相關的處理必亮出神奇的正規運算式,能用一個正規表示法的絕不用兩個,能用高級特性的絕不用簡單特性……隨之而來的是其他人debug時層出不窮的抱怨,更不用提更新時膽戰心驚的煩惱。要知道,熟練使用正規運算式,卻不濫用正規運算式,同時考慮合作同事的感受和效率,才能真正贏得大家的尊敬。
武學大師說:武功不是用來傷害,而是用來制止傷害的。哲學大師說:沒有審慎思考,不懂得克制的人生,是不值得過的。這些道理聽起來有悖常理,我花了不少時間才終於弄懂。我相信,正在閱讀這本書的你,也應當懂得這些道理。
特別感謝兩位女士,西喬和劉舫。西喬為這本書設計的封面,絲毫不受歲月的影響。劉舫編輯細緻嚴謹的工作態度,支撐著我完成《正規表示法》的第2版,再寫下這篇序。
余晟
2018年9月3日