Мне интересно, если это лучший способ сопоставить строку, которая начинается с частного IP-адреса (Perge-regex):
(^127\.0\.0\.1)|(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])
Спасибо большое!
Мне интересно, если это лучший способ сопоставить строку, которая начинается с частного IP-адреса (Perge-regex):
(^127\.0\.0\.1)|(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])
Спасибо большое!
Я предполагаю, что вы хотите совместить эти диапазоны:
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\.)
Также обратите внимание, что это предполагает, что IP-адреса уже проверены - он принимает такие вещи, как 10.foobar
.
Это то же самое, что и правильный ответ Mark, но теперь включая частные адреса IPv6.
/(^127\.)|(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/
Я сгенерировал это
РЕГЭКСП ДЛЯ КЛАССА СЕТЕЙ:
(10)(\.([2]([0-5][0-5]|[01234][6-9])|[1][0-9][0-9]|[1-9][0-9]|[0-9])){3}
РЕГЭКСП ДЛЯ СЕТЕЙ КЛАССА B:
(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:
(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].). *"
Выглядит правильно. Лично я бы изменил первый на:
^127\.0
При этом: (^127\.0\.0\.1)
вы ищете все, что начинается с 127.0.0.1
, и пропустите 127.0.0.2*
, 127.0.2.*
, 127.0.*
и т.д.
Это на тот случай, если вы решите пойти с моим комментарием, предложив вам не использовать регулярные выражения. Untested (но, вероятно, работает или, по крайней мере, близко), в Perl:
@private = (
{network => inet_aton('127.0.0.0'), mask => inet_aton('255.0.0.0') },
{network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') },
# ...
);
$ip = inet_aton($ip_text);
if (grep $ip & $_->{mask} == $_->{network}, @private) {
# ip address is private
} else {
# ip address is not private
}
Обратите внимание, как @private
- это просто данные, которые вы можете легко изменить. Или загрузите на лету из Cymru Bogon Reference.
edit: Мне кажется, что запрос Perl regexp не означает, что вы знаете Perl, поэтому в ключевой строке есть "grep", который просто перебирает каждый диапазон адресов. Вы берете свой IP-адрес, побитовое, а также сетевую маску и сравниваете с сетевым адресом. Если он равен, его часть этой частной сети.
Если вы ищете конфигурацию по умолчанию для прокси-сервера system.net и прокси-сервера, которая использует прокси для внешних, но использует прямые подключения для внутренних хостов (может быть с поддержкой ipv6)...
<system.net>
<defaultProxy enabled="true">
<proxy proxyaddress="http://proxycluster.privatedomain.net:8080" bypassonlocal="True" />
<bypasslist>
<!-- exclude local host -->
<add address="^(http|https)://localhost$" />
<!-- excludes *.privatedomain.net -->
<add address="^(http|https)://.*\.privatedomain\.net$" />
<!-- excludes simple host names -->
<add address="^(http|https)://[a-z][a-z0-9\-_]*$" />
<!-- exclude private network addresses 192.168, 172.16..31 through 31, 127.* etc. -->
<add address="^(http|https)://((((127)|(10))\.[0-9]+\.[0-9]+\.[0-9]+)|(((172\.(1[6-9]|2[0-9]|3[0-1]))|(192\.168))\.[0-9]+\.[0-9]+))$"/>
</bypasslist>
</defaultProxy>
<connectionManagement>
<add address="*" maxconnection="10" />
</connectionManagement>
</system.net>
вот что я использую в 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})$')
Вы можете удалить привязки ^ и/или $, если хотите.
Я предпочитаю вышеупомянутое регулярное выражение, потому что он отсеивает недопустимые октеты (что-то выше 255).
пример использования:
if rfc1918.match(ip):
print "ip is private"
//RegEx to check for the following ranges. IPv4 only
//172.16-31.xxx.xxx
//10.xxx.xxx.xxx
//169.254.xxx.xxx
//192.168.xxx.xxx
var regex = /(^127\.)|(^(0)?10\.)|(^172\.(0)?1[6-9]\.)|(^172\.(0)?2[0-9]\.)|(^172\.(0)?3[0-1]\.)|(^169\.254\.)|(^192\.168\.)/;
FWIW этот шаблон был более 10% быстрее, используя pattern.matcher
:
^1((0)|(92\\.168)|(72\\.((1[6-9])|(2[0-9])|(3[0-1])))|(27))\\.