(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)(?:[\/|\s](3[0 - 2]|2[0 - 9]|1[0 - 9]|\d))?
解读:
- 对于每个
(25[0 - 5]|2[0 - 4]\d|[0 - 1]\d{2}|[1 - 9]?\d)
部分:25[0 - 5]
:- 这部分用于匹配 250 - 255 这个区间的数字。
25
是固定的前缀,[0 - 5]
表示匹配 0 - 5 中的任意一个数字,这样就可以匹配 250、251、252、253、254、255。
- 这部分用于匹配 250 - 255 这个区间的数字。
2[0 - 4]\d
:- 用于匹配 200 - 249 这个区间的数字。
2
是百位数字,[0 - 4]
表示十位数字可以是 0 - 4 中的任意一个,\d
(等同于[0 - 9]
)表示个位数字可以是 0 - 9 中的任意一个。例如,200、201、239 等数字都可以被匹配。
- 用于匹配 200 - 249 这个区间的数字。
[0 - 1]\d{2}
:- 用于匹配 000 - 199 这个区间的数字。
[0 - 1]
表示百位数字可以是 0 或者 1,\d{2}
表示后面跟着两个数字(十位和个位),这两个数字可以是 0 - 9 中的任意一个。比如 000、001、099、100、199 等。
- 用于匹配 000 - 199 这个区间的数字。
[1 - 9]?\d
:- 这部分有两种情况。当
[1 - 9]?
部分匹配 0 次时,也就是没有匹配到数字(这种情况适用于数字 0),然后\d
匹配 0 - 9 中的任意一个数字,这样可以匹配 0 - 9 这些一位数;当[1 - 9]?
部分匹配 1 次时,[1 - 9]
匹配 1 - 9 中的任意一个数字,然后\d
再匹配一个 0 - 9 中的任意一个数字,这样可以匹配 10 - 99 这些两位数。
- 这部分有两种情况。当
\.(25[0 - 5]|2[0 - 4]\d|[0 - 1]\d{2}|[1 - 9]?\d)
:\.
部分是一个转义字符 “.”,因为在正则表达式中 “.” 是一个特殊字符,表示匹配除换行符之外的任意一个字符。这里使用转义字符\
使得 “.” 就表示字符 “.” 本身,用于分隔 IP 地址的四个部分。后面的(25[0 - 5]|2[0 - 4]\d|[0 - 1]\d{2}|[1 - 9]?\d)
和前面的部分一样,用于匹配 IP 地址的下一个部分。整个表达式重复四次,分别匹配 IP 地址的四个部分。
- (?:[\/|\s](3[0 - 2]|2[0 - 9]|1[0 - 9]|\d))?部分:
(?:
- 开始一个非捕获组,它把里面的内容作为一个整体看待,但不会单独捕获这个组的内容用于后续引用之类的操作。
[\/|\s]
- 匹配 “/” 或者空白字符(空格、制表符等),用来表示可能出现的分隔 IP 地址和掩码的符号。
(3[0 - 2]|2[0 - 9]|1[0 - 9]|\d)
用于匹配子网掩码的具体数字部分,和之前的含义一样。
)?
整体表示这个非捕获组内的内容(也就是分隔符及掩码部分)可以出现 0 次或者 1 次。这样即使没有写分隔符以及后面的掩码,也依然能够匹配成功,整个表达式就可以匹配单纯的 IP 地址或者 IP 地址加掩码的情况。