abstract:其實沒那么麻煩了,Sublime Text 或 類似編輯器的 『ctrl + F』 足矣,平時開發(fā)順帶練了.記得打開左下的正則開關其實大部分涉及到字符串模式匹配的都可以用正則解決,我大概羅列下自己的經歷1. 入門: 解決各個業(yè)務上的問題,比如郵箱、手機號等等,開始知道正則能解決什么問題,以及正則的受限性。2. 進階: 比如在最初寫GitHub - leeluolee/puer: more than
其實沒那么麻煩了,Sublime Text 或 類似編輯器的 『ctrl + F』 足矣,平時開發(fā)順帶練了.
記得打開左下的正則開關
其實大部分涉及到字符串模式匹配的都可以用正則解決,我大概羅列下自己的經歷
1. 入門: 解決各個業(yè)務上的問題,比如郵箱、手機號等等,開始知道正則能解決什么問題,以及正則的受限性。
2. 進階: 比如在最初寫GitHub - leeluolee/puer: more than a live-reload server, built for efficient front-end development的時候, 嘗試實現一個簡化的router。 在這個過程中,開始會使用子匹配和特定的宿主語言API實現一些高級特性,類express的route 會支持 括號內引入子規(guī)則 ,比如 /api/blogs/:id(\d+) ,這里會有一些較復雜遞歸的處理,配合String.prototype.replace(首參數支持正則)可以較好的解決。在這個階段,基本我已經可以感覺已經無需查閱任何關于正則的資料,可以自行解決不太復雜的文本模式匹配問題,初步形成了記憶。
3. 再進階: 碰到更復雜的正則表達式的需求 我嘗試了使用javascript生成正則表達式,比如在GitHub - leeluolee/nes: a small js selector lib with incredible extensibility, but still very fast 拼裝了一個下面的正則,這個幾乎是無法人肉維護了,必須用代碼生成。
/(\s*,\s*)|(#([\w\u4e00-\u9fbf-]+))|(\*|\w+)|(\.([\w\u4e00-\u9fbf-]+))| (:([\w\u4e00-\u9fbf-]+)(?:\(([^\(\)]*|(?:\([^\)]+\)|[^\(\)]*)+)\))?)| (\[([\w\u4e00-\u9fbf-]+)(?:([*^$|~!]?=)['"]?((?:[\w\u4e00-\u9fbf-]||\s)+)['"]?)?\])|(::([\w\u4e00-\u9fbf-]+)) |([>\s+~&%](?!=))|(\s*\{\s*(\d*),(\-?\d*)\s*\}\s*)/g
后面的一些非業(yè)務項目,涉及到的更復雜場景,基本也是類似的解決方案,只不過生成的正則更加惡心。我可以列舉下,比如
https://github.com/leeluolee/mcss/blob/master/lib/tokenizer.js#L199
https://github.com/regularjs/regular/blob/master/src/parser/Lexer.js#L225
后面碰到的這些問題,其實有些不算是完全的正則了,因為會與上下文相關,到這里基本上你可以有十足的把握清楚何時才去使用正則表達式。