首頁·正規表示式

正規表示式 133 例

從寫法本身,到電子郵件、日期、位址的檢查。每個式子都配了該符合的例子和不該符合的例子,而且測試每次都真的跑一遍。

寫法28

規定怎樣指向單個字元的寫法。其餘一切都從這裡開始。

重複與分組17

規定重複多少次,以及把哪一段看作一個整體。

前後查看8

只查看前後有什麼,並不把它吃掉。疊加條件時用得上。

整串檢查44

兩端都錨住,整個字串合上才算通過。輸入檢查用的就是這類。

^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$一個電子郵件位址^https?://[^\s/$.?#][^\s]*$一個網址^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$一個網域名稱^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$一個 IPv4 位址^(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$不省略寫全的 IPv6 位址^(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}$一個 MAC 位址^(?:6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4})$一個連接埠號^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$一個 UUID^#(?:[0-9a-f]{3}|[0-9a-f]{6})$十六進位色碼^rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)$rgb() 形式的色彩值^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ISO 格式的日期^(?:0[1-9]|[12]\d|3[01])/(?:0[1-9]|1[0-2])/\d{4}$用斜線寫的日期^(?:[01]\d|2[0-3]):[0-5]\d$24 小時制的時刻^(?:0?[1-9]|1[0-2]):[0-5]\d\s?(?:am|pm)$帶 am/pm 的時刻^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$完整的 ISO 時間戳記^P(?=\d|T\d)(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+S)?)?$ISO 格式的時間長度^\d+\.\d+\.\d+(?:-[0-9a-z.-]+)?(?:\+[0-9a-z.-]+)?$語意化版本號^\d+$不帶符號的整數^[+-]?\d+$可以帶符號的整數^-?\d+(?:\.\d+)?$可以帶小數部分的數^-?\d+(?:\.\d+)?[eE][+-]?\d+$用科學記數法寫的數^(?:100(?:\.0+)?|\d{1,2}(?:\.\d+)?)%$0 到 100 之間的百分比^\d{1,3}(?:,\d{3})*$每三位打一個逗號的數^[$€£¥₩]\s?\d{1,3}(?:,\d{3})*(?:\.\d{2})?$帶貨幣符號的金額^[0-9a-f]+$十六進位字串^[01]+$只由 0 和 1 組成的字串^[0-7]+$八進位字串^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$base64 編碼的字串^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$由兩個點分成三段的 JWT^\+[1-9]\d{7,14}$國際標準格式的電話號碼^[a-z][a-z0-9_]{2,15}$以字母開頭的使用者名稱^[a-z0-9]+(?:-[a-z0-9]+)*$用在網址裡的連字詞^[^\\/:*?"<>|]+\.[a-z0-9]+$帶副檔名的檔名^.+\.(?:jpe?g|png|gif|webp|avif|svg)$圖片檔案的副檔名^/(?:[^/\0]+/)*[^/\0]*$Unix 風格的路徑^[A-Za-z]:\\(?:[^\\/:*?"<>|]+\\)*[^\\/:*?"<>|]*$Windows 路徑^</?[a-z][a-z0-9]*(?:\s[^<>]*)?/?>$單個 HTML 標籤^\.-?[_a-z][_a-z0-9-]*$CSS 類別選擇器^M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})$羅馬數字^-?(?:90(?:\.0+)?|[1-8]?\d(?:\.\d+)?)$緯度值^-?(?:180(?:\.0+)?|1[0-7]\d(?:\.\d+)?|\d{1,2}(?:\.\d+)?)$經度值^(?:0|[1-9]\d*)$開頭不帶 0 的數^\d*[02468]$偶數^\s*$一行空白

擷取與清理36

用來從一段文字裡只挑出、或只刪掉需要的那部分。

怎麼看這一頁

  • 兩端加上 ^ 和 $,整個字串就必須合上;不加,比對落在文中任何位置都行。用來做輸入檢查的式子,一定要加錨。
  • 圓括號 ( ) 會把括住的部分擷取下來。只是想分組的話寫成 (?: ),後面各組的編號才不會往後挪。
  • 這裡的每個式子都拿它自己的例子跑過。不過「長得像電子郵件」和「真有這個信箱」始終是兩回事。
  • 開放式重複層層巢狀(比如 (a+)+)時,遇到某些輸入耗時會爆炸式增長。把別人的式子貼進程式前,先找找有沒有這種形狀。

常見問題

Q. 什麼是正規表示式?

它是一門小語言,用來描述你想在文字裡找的「形狀」。寫 \d{4} 而不是「四位數字」,程式就能找出每一處符合這個形狀的地方。JavaScript、Python、Java 等大多數語言用的寫法幾乎相同。

Q. 電子郵件的檢查式為什麼這麼短?

完全照標準寫的郵件式子長達數千字元,而且照樣說不出這個信箱是否真的存在。擋住手滑打錯,才是正規表示式能做的事;真正的確認只有寄一封驗證信。

Q. 為什麼同一個式子在各語言裡略有不同?

骨架一樣,細節不同。JavaScript 沒有 \A,Python 要單獨打開 re.MULTILINE。這裡列出的式子都是按在 JavaScript 裡原樣能跑的形式寫的。

Q. 說式子可能很慢,是什麼意思?

像 (a+)+ 這樣開放式重複巢在一起時,遇到比對不上的輸入,回溯的路數會爆炸。這時哪怕很短的字串也可能耗上好幾秒,放在伺服器上很危險。

Q. 這裡的式子可信嗎?

每個式子都帶著「必須符合」和「必須不符合」兩組例子,測試會把 133 個全部真跑一遍。頁面上看到的例子就是測試用的例子,所以說明和式子不可能各走各的。