說到正規表達式,一直是令我頭疼的問題,這家夥一般時候用不到,等用到的時候發現它的規則是一點兒也記不住,\d表示一個數字,\s表示包括下劃線在内的任意單詞字元,也就是 [A-Za-z0-9_],還有[\s\S]*可以比對包括換行在内的任意字元串。
這你都能記住嗎,如果能的話,那真的佩服,反正我是記不住,之前每次手寫的時候都得跟查字典似的一個個的查,簡單的還好,複雜的就很痛苦了。
過程往往是這個樣子的:
1、 先打開 Google,搜尋一篇正規表達式,找到一份像上圖那樣的字典教程,先看個幾分鐘,回憶回憶,還有可能回憶不起來。
2、然後就開始根據需求寫一個正規表達式。
3、放到程式中執行一下。
4、诶,怎麼不好用,比對不上啊,接着修改正則。
5、繼續從 3 - 4 的循環,直到運氣來了,正常出結果了。
這是最早的時候,真的是全靠那點僅有的實力和運氣了。
記得剛畢業不久的時候,有一次上司給安排一個任務,要在一堆 PDF 檔案裡把我們需要的資料摘出來。PDF 這玩意兒吧,你把它的内容讀出來,它就是一大段文本,要在這一堆内容不一緻的檔案中準确的拿到資料,第一反應就是用正則。
當時的做法就是上面的 1-5這幾步來的,加上當時候剛畢業比較菜,跌跌撞撞才把程式寫好,中間有幾次調試的時候,程式一跑起來,VS(Visual Studio)就特别卡。對的,就是宇宙第一強大的 IDE ,當時我還在寫 C#,縱然是宇宙第一強大,也被我弄的特别卡。
當時隻道是正則寫的有問題,然後就一直改。
後來才知道,那是因為正則寫的不合理,發生了回溯現象,越不合理,回溯越嚴重,加上當時的 PDF 内容很多,是以導緻開發工具都卡了,這要是整到線上,那怕是混不下去了。
關于回溯的問題,可以參考下面這篇文章《失控的正規表達式:災難性的回溯》
www.regular-expressions.info/catastrophi…
後來就不至于那麼菜了,知道了一些關于正規表達式的線上網站,上面有一些常用的正規表達式,不用自己搗鼓了,能偷懶當然要偷懶了。可以在 Goolge 上搜尋關鍵詞「正規表達式 線上」,然後就會出來一大堆,直接在上面用那些常用的正則,例如手機号、郵箱、網址啊,基本上能解決90%的需求場景。
另外的10%呢,以前可能隻能自己琢磨了,現在都2023年了,基本上99%的機率都不用親自動手了,當然了,如果是大佬呢,就想自己寫,那完全沒問題。
ChatGPT 完美解決,幾秒就可以寫出你想要的正則比對
ChatGPT是由OpenAI開發的一種基于GPT(Generative Pre-trained Transformer)的語言模型。它是一個強大的對話系統,可以了解自然語言輸入并生成相應的回複。
GPT是一種基于Transformer架構的深度學習模型,它使用了大規模的文本資料進行預訓練。在預訓練階段,GPT模型通過無監督學習從海量文本中抽取出語言的潛在模式和規律。這使得它在了解和生成自然語言文本方面具有很強的能力。
ChatGPT是在GPT的基礎上進行微調和優化,使其更适用于對話場景。它可以接收使用者的文本輸入,了解輸入的語義和上下文,并生成相關的回複。ChatGPT可以應用于各種對話任務,包括回答問題、提供建議、進行閑聊等。
由于ChatGPT的訓練資料主要來自網際網路,它具有廣泛的知識覆寫和語言表達能力。它可以對各種主題進行回答和讨論,但需要注意,它并不具備實時更新的能力,是以在提供資訊時可能會受到訓練資料的限制。
盡管ChatGPT在許多方面表現出色,但它也有一些局限性。它可能存在對語義了解的誤解或模棱兩可的回答,對于敏感資訊和個人資料的處理也需要謹慎。另外,ChatGPT不能替代人類專業知識和經驗,仍然需要人類的審慎和判斷。
總的來說,ChatGPT是一種強大的語言模型,能夠進行對話互動并生成合理的回複。它在各種對話場景中發揮着重要的作用,為使用者提供了便利和資訊。
比如最簡單的,用Java比對中國的手機号,直接讓 ChatGPT 把正則寫出來,而且連代碼都給你寫好了。
至于網址、郵箱等等也不在話下了。
不僅ChatGPT 可以,連百度文心一言也可以。百度文心一言雖然這樣可以,但是如果你反過來問它,它就蒙圈了。
不僅僅是正規表達式,ChatGPT可以幫我們寫一些比較耗時耗力的代碼,比如讓它幫我們寫個快速排序算法
看看,連注釋都給你寫好了,超級貼心有沒有?
再舉一個例子
比對一段 HTML 中的某個部分也是正則的常用場景,做過爬蟲的或多或少都用過正則吧。
比如我在一大段 HTML 中有這麼一部分
html複制代碼<div class="time">這是一個,this is some</div>
現在要拿到這個 div 中的内容部分,當然有很多其他的方式了,比如 Java 版的 jsoup,使用 xpath、css selector 等都可以,但是如果就要用正則呢,是不是自己寫的話,一般菜鳥就感覺很麻煩了。
這時候我們問問 ChatGTP ,看看它怎麼搞的。
直接就這麼問了:
<div> <div class="outer"> <div class="time">這是一個,this is some</div> <div class="button">button</div> </div> </div>, 用 Java 正規表達式比對這段 HTML 中 class="time" 的這個标簽的 Text 部分
直接拿過代碼跑一下,沒有任何問題。
有同學說了,這麼明顯的标簽,還用的着 ChatGPT ,直接拿過來就寫了。
這裡隻是舉個例子,如果哪位有比較複雜的比對邏輯,也可以用ChatGPT 來試試,基本上99%都能直接解決。
還有一個網站很厲害
如果你沒有辦法或者不想用 ChatGPT ,也不想用百度文心一言這些,我還發現一個網站,這個網站我嚴重懷疑它已經接入了 ChatGPT ,它也支援通過自然語言描述,就能給出相應的正規表達式。
網站位址:wangwl.net/static/proj…
比如我跟他說:提取一段字元串中的中國手機号碼部分,而且還有正則可視化。
上面的那個比對 HTML 的例子,我也在這個網站上試過,結果也是可以的。
純粹的好東西分享,我跟這個網站沒有任何關系。
一個幫你分析正則的網站
接下來這個網站呢,如果你想對正則有比較深入的了解,或者想看看自己寫好的正則或ChatGPT 幫你生成的正規表達式效果怎麼樣,性能好不好,都可以在這個網站進行。
網站位址:regex101.com/
網站左側可以選擇你的目智語言,也就是你的代碼實作是哪種語言 Java 還是 JavaScript 等。
中間上方是正規表達式,中間下方是待比對的内容。
右側上方是你寫的正則對待比對内容完整的比對分析過程,非常詳細,可以通過這裡清楚的看出這個正則比對的時候經過了哪些路徑。
右側下方是最終的比對結果。
如果你寫的正則在工作的時候發生了明顯的回溯,這裡也會給出提示,告訴你問題,讓你去優化。
來看看ChatGPT對如何學好正規表達式總結
要掌握正規表達式,可以按照以下步驟進行:
- 學習正規表達式的基本文法:了解正規表達式的基本元字元和特殊符号,如.、*、+、?、[]、()等。這些符号具有特定的含義和用法,掌握它們是了解和建構正規表達式的基礎。
- 借助線上工具和教程:有許多線上正規表達式工具可供使用,如Regex101、Regexr等。使用這些工具可以實時驗證和測試你的正規表達式,并提供詳細的解釋和比對結果。此外,有許多教程和文檔可供學習,如正規表達式的官方文檔、教程網站、書籍等。這些資源可以幫助你了解正規表達式的各個方面。
- 實踐和練習:編寫和調試正規表達式的最佳方法是通過實踐和練習。嘗試解決各種文本比對和提取問題,使用正規表達式處理字元串。通過實際的練習,你将更好地了解正規表達式的工作原理,并逐漸掌握常見的模式和技巧。
- 參考案例和示例:查找和學習一些常見的正規表達式案例和示例,例如電子郵件驗證、URL解析、日期格式比對等。了解這些常見的用例和解決方案,可以幫助你更好地了解正規表達式的應用,并為你在實際項目中使用正規表達式提供參考。
- 閱讀進階内容:一旦你掌握了正規表達式的基礎知識,可以進一步學習進階的正規表達式技巧和概念。例如,學習捕獲組、零寬斷言、貪婪與非貪婪比對、模式修飾符等。這些進階概念可以幫助你更靈活地處理複雜的比對需求。
- 反複練習和應用:正規表達式需要反複練習和應用,才能真正掌握和熟練運用。在實際項目中使用正規表達式,解決實際問題,并不斷改進和優化你的正規表達式。通過不斷的實踐和經驗積累,你将逐漸成為一個熟練的正規表達式使用者。