在處理文字資料時,從海量文本中精準提取網址是常見需求。正則表達式雖然強大,但 URL 結構複雜(協議、域名、埠號、路徑、查詢參數、片段識別符),單一模式難以覆蓋所有情況。本文整理多種實戰驗證的正則模式,涵蓋 HTTP/HTTPS/FTP 協議、IP 位址、域名、埠號、路徑參數等場景,並附帶匹配/不匹配範例,供開發者依據業務需求選擇。
(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?
https://regxlib.com/Default.aspx、https://electronics.cnet.com/electronics/0-6342366-8-8994967-1.htmlwww.yahoo.com(缺少協議頭)^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?(/[^/][a-zA-Z0-9\.\,\?\'\\/\+&%\$#\=~_\-@]*)*$
https://www.sysrage.net、https://64.81.85.161/site/file.php?cow=moo's、ftp://user:pass@host.com:123sysrage.net(缺少協議)^(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$
www.blah.com:8103、www.blah.com/blah.asp?sort=ASC、www.blah.com/blah.htm#blahwww.state.ga(非標準頂級域)、https://www.blah.ru(未列入允許的 TLD 列表)\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
https://foo.com/blah_blah、(Something like https://foo.com/blah_blah)、<https://foo.com/blah_blah>、https://userid:password@example.com:8080no_ws.example.com、/relative_resource.php| 用途 | 正則模式 | 說明 |
|---|---|---|
| UNC 路徑 (Windows 網路路徑) | ^\\{2}[\w-]+\\(([\w-][\w-\s]*[\w-]+[\$]?$)|([\w-][\$]?$)) | 匹配 \\server\service、\\serv_001\service$ |
| 本地檔案路徑 | ^([a-zA-Z]\:|\\\\[^\/\\:*?"<>|]+\\[^\/\\:*?"<>|]+)(\\[^\/\\:*?"<>|]+)+(\.[^\/\\:*?"<>|]+)$ | 匹配 c:\Test.txt、\\server\shared\Test.txt |
| 域名格式驗證 | ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$ | 匹配 regexlib.com、3com.com,排除連字符開頭/結尾 |
正則表達式是把雙刃劍,複雜模式難以維護。建議在專案中封裝為工具類,附上完整測試用例(正向/負向),並隨業務演進持續優化。現代開發中,亦可考慮使用成熟庫(如 Java `java.net.URL` 解析、Python `urllib.parse`、JS `URL` API)輔助驗證,以正則為補充,構建更可靠的 URL 處理體系。