Какой RegEx будет соответствовать всем адресам обратной связи? - PullRequest
12 голосов
/ 08 декабря 2011

У меня есть приложение, которое должно предупреждать пользователя при использовании localhost, 127.0.0.1, ::1 или любого петлевого адреса (целевой хост используется для соединения базы данных с базой данных, не обязательно внутри среда приложения). Это усложняется, потому что адреса, подобные следующим ...

  • 127.1
  • 127.0.01
  • 127.0000.0000.1
  • 127.0.0.254
  • 127.63.31.15
  • 127.255.255.254
  • 0::1
  • 0000::0001
  • 0000:0:0000::01
  • 0000:0000:0000:0000:0000:0000:0000:0001

... будет правильно обрабатывать код потребления и преобразуется в зацикливание.

Что такое регулярное выражение, которое будет соответствовать любой перестановке адресов обратной связи IPv4 и IPv6?

Ответы [ 3 ]

21 голосов
/ 08 декабря 2011

После небольшого перерыва в RegexBuddy (который является действительно великолепным инструментом для тестовой конструкции RegEx ), я придумал следующее:

^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$

Этот RegEx соответствует

Строка "localhost"

  • localhost
  • LOCALHOST

Эти перестановкипетлевого адреса IPv4

  • 127.0.0.1
  • 127.0.0.001
  • 127.0.00.1
  • 127.00.0.1
  • 127.000.000.001
  • 127.0000.0000.1
  • 127.0.01
  • 127.1
  • 127.001
  • 127.0.0.254
  • 127.63.31.15
  • 127.255.255.254

Эти перестановки адреса обратной связи IPv6

  • 0:0:0:0:0:0:0:1
  • 0000:0000:0000:0000:0000:0000:0000:0001
  • ::1
  • 0::1
  • 0:0:0::1
  • 0000::0001
  • 0000:0:0000::0001
  • 0000:0:0000::1
  • 0::0:1

Этот RegEx не соответствует

Действительное имя сервера

  • servername
  • subdomain.domain.tld

Эти действительные IPv4адреса

  • 192.168.0.1
  • 10.1.1.123

Эти действительные адреса IPv6

  • 0001::1
  • dead:beef::1
  • ::dead:beef:1
4 голосов
/ 08 декабря 2011

Если вас не интересует, является ли адрес действительным, тогда это должно сработать:

/^(127\.[\d.]+|[0:]+1|localhost)$/i
1 голос
/ 19 сентября 2015

Я создал это регулярное выражение для захвата различных перестановок адресов петлевого IPv6:

* +1004 * (0 {0,4}: {1,2}) {1,7} ({0} 0,3 1)

Я проверил это по следующим адресам:

  • 0: 0: 0: 0: 0: 0: 0: 1
  • 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0001
  • :: 1
  • 0 :: 1
  • 0: 0: 0 :: 1
  • 0: 0: 0000 :: 1
  • 0000: 0: 00 :: 0001
  • 0000 :: 0001
  • 0000: 0: 0000 :: 0001
  • 0000: 0: 0000 :: 1
  • 0 :: 0: 1

и он захватил их всех.

Вы можете проверить это на http://regexr.com/3bqpm

...