一條正規表示式同時匹配IP(含有IPv6)和網域名稱

2021-09-05 12:08:01 字數 2856 閱讀 8682

開發中需要對ip(如127.0.0.1)和網域名稱或主機名(如www.csdn.net)同時做校驗,查了很多技術部落格基本是分別做驗證。

對ip或網域名稱單獨做正則驗證可以使用(取自

validipaddressregex = "^(([0-9]|[1-9][0-9]|1[0-9]|2[0-4][0-9]|25[0-5])\.)([0-9]|[1-9][0-9]|1[0-9]|2[0-4][0-9]|25[0-5])$";

validhostnameregex = "^(([a-za-z0-9]|[a-za-z0-9][a-za-z0-9\-]*[a-za-z0-9])\.)*([a-za-z0-9]|[a-za-z0-9][a-za-z0-9\-]*[a-za-z0-9])$";

該篇部落格提到可以聯合使用兩者來做ip和網域名稱驗證。但是兩者合在一塊兒使用會存在validhostnameregex會驗證類似256.2.2.2的非法ip位址。

我的初步解決辦法是先判斷輸入的iporhostname是否為純數字(如127.0.0.1),是的話做validipaddressregex,否則做validhostnameregex。這個辦法可以解決問題,但是**邏輯過於複雜。

後來google查到更好的解決辦法(取自

validipaddressandhostnameregex = ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(([a-za-z0-9]|[a-za-z0-9][a-za-z0-9\-]*[a-za-z0-9])\.)+([a-za-z]|[a-za-z][a-za-z0-9\-]*[a-za-z0-9])$
如果考慮ipv6,上面的表示式仍然驗證不了,可以參考下面的正則,表示式很長,但親測可用(取自

validipv4v6andhostnameregex = ^(([0-9]|[1-9][0-9]|1[0-9]|2[0-4][0-9]|25[0-5])\.)([0-9]|[1-9][0-9]|1[0-9]|2[0-4][0-9]|25[0-5])$|^(([a-za-z]|[a-za-z][a-za-z0-9\-]*[a-za-z0-9])\.)*([a-za-z]|[a-za-z][a-za-z0-9\-]*[a-za-z0-9])$|^(?:(?:(?:(?:(?:(?:(?:[0-9a-fa-f])):))(?:(?:(?:(?:(?:[0-9a-fa-f])):(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.)(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-fa-f])):))(?:(?:(?:(?:(?:[0-9a-fa-f])):(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.)(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-fa-f])))?::(?:(?:(?:[0-9a-fa-f])):))(?:(?:(?:(?:(?:[0-9a-fa-f])):(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.)(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fa-f])):)(?:(?:[0-9a-fa-f])))?::(?:(?:(?:[0-9a-fa-f])):))(?:(?:(?:(?:(?:[0-9a-fa-f])):(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.)(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fa-f])):)(?:(?:[0-9a-fa-f])))?::(?:(?:(?:[0-9a-fa-f])):))(?:(?:(?:(?:(?:[0-9a-fa-f])):(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.)(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fa-f])):)(?:(?:[0-9a-fa-f])))?::(?:(?:[0-9a-fa-f])):)(?:(?:(?:(?:(?:[0-9a-fa-f])):(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.)(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fa-f])):)(?:(?:[0-9a-fa-f])))?::)(?:(?:(?:(?:(?:[0-9a-fa-f])):(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.)(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fa-f])):)(?:(?:[0-9a-fa-f])))?::)(?:(?:[0-9a-fa-f])))|(?:(?:(?:(?:(?:(?:[0-9a-fa-f])):)(?:(?:[0-9a-fa-f])))?::))))$
希望對小夥伴們有用~ 

插播一條 常用正規表示式

是我資料結構逆波蘭表示式的 中用到了一句。因此搜尋學習了一下。字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性...

正規表示式 匹配IP 網域名稱

ip是由四段組成,每一段是0 255的數字,段與段之間用小數點隔開,比如192.168.1.1就是合法的ip位址。如果正規表示式寫成d d 無疑是不負責的,因為它可以匹配300.400.555.666這樣的非法ip字串。如果要匹配乙個0 255之間的數,有幾種匹配方式,下面是其中一種 匹配正規表示式...

正規表示式匹配ip位址

ipv4的ip位址都是 1 255 0 255 0 255 0 255 的格式 下面給出相對應的正規表示式 1 d 2 0 4 d 25 0 5 1 9 d 1 9 1 d 2 0 4 d 25 0 5 1 9 d d 1 d 2 0 4 d 25 0 5 1 9 d d 1 d 2 0 4 d 2...