正则表达式中的私有IP地址标识符

cas*_*mcl 31 regex private ip-address

我想知道这是否是匹配以私有IP地址(Perl风格的Regex)开头的字符串的最佳方式:

(^127\.0\.0\.1)|(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Mar*_*ers 53

我假设你想匹配这些范围:

127.  0.0.0 – 127.255.255.255     127.0.0.0 /8
 10.  0.0.0 –  10.255.255.255      10.0.0.0 /8
172. 16.0.0 – 172. 31.255.255    172.16.0.0 /12
192.168.0.0 – 192.168.255.255   192.168.0.0 /16

你错过了一些可能导致它接受的点,172.169.0.0即使这不应该被接受.我在下面修了它.删除新行,只是为了便于阅读.

(^127\.)|
(^10\.)|
(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|
(^192\.168\.)
Run Code Online (Sandbox Code Playgroud)

另请注意,这假设IP地址已经过验证 - 它接受类似的内容10.foobar.

  • 自动链接本地私有地址169.254.*.*也应该在此集合中.紧凑地写:`^(10 | 127 | 169\.254 | 172\.1 [6-9] | 172\.2 [0-9] | 172\.3 [0-1] | 192\.168)\.` (3认同)
  • 第一行应该是(^ 127 \.)| (2认同)
  • Java版本:`'(^ 127 \\.0 \\.0 \\.1)|(^ 10 \\.)|(^ 172 \\.1 [6-9] \\.)|(^ 172 \\ 2 [0-9] \\)|.(^ 172 \\ 3 [0-1] \\)|....(^ 192 \\ 168 \\)'` (2认同)

Edw*_*ard 18

这与Mark的正确答案相同,但现在包括IPv6私有地址.

/(^127\.)|(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/
Run Code Online (Sandbox Code Playgroud)

  • 不好 - 根据维基百科(http://en.wikipedia.org/wiki/Unique_local_address),块(fc00 ::/7)保留用于唯一本地地址.此Regex仅将localhost地址(:: 1)添加到接受的解决方案中. (4认同)
  • 根据https://github.com/rails/rails/pull/12651/files,这个regexp将是`^ [fF] [cCdD]` - 我正在相应地编辑答案. (3认同)

小智 10

我已经生成了这个

CLEX A NETWORKS的REGEXP:

(10)(\.([2]([0-5][0-5]|[01234][6-9])|[1][0-9][0-9]|[1-9][0-9]|[0-9])){3}

B类网络的REGEXP:

(172)\.(1[6-9]|2[0-9]|3[0-1])(\.(2[0-4][0-9]|25[0-5]|[1][0-9][0-9]|[1-9][0-9]|[0-9])){2}

C类网络的REGEXP:

(192)\.(168)(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){2}

如果您遇到任何错误,请告诉我

如果您确定输出(例如netstat)并且您不需要检查IP地址有效性,因为它已经完成,那么您可以使用此公式捕获私有IP地址

grep -P"(10.| 192.168 | 172.1 [6-9].| 172.2 [0-9].| 172.3 [01].).*"

  • 通过对200到255范围使用"[2] [0-5] [0-5]",206到209和216到219等数字将不匹配.你必须用`([0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9]替换它| 25 [0-5])`. (4认同)

Jos*_*ley 6

这是我在 python 中使用的:

rfc1918 = re.compile('^(10(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){3}|((172\.(1[6-9]|2[0-9]|3[01]))|192\.168)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){2})$')
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以删除 ^ 和/或 $ 锚点。

我更喜欢上面的正则表达式,因为它会清除无效的八位字节(任何高于 255 的字节)。

用法示例:

if rfc1918.match(ip):
    print "ip is private"
Run Code Online (Sandbox Code Playgroud)