Pergunta

Então eu preciso para coincidir com um endereço IPv6 que pode ou não pode ter uma máscara. Infelizmente eu não pode apenas usar uma biblioteca para analisar a cadeia.

O bit máscara é bastante fácil, neste caso:

(?:\/\d{1,3})?$/

A parte mais difícil é os diferentes formatos de um endereço IPv6. Ele precisa corresponder :: carne bovina, carne ::, carne :: carne, etc.

Uma atualização: Eu estou quase lá ..

/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i

Estou, neste caso restrito a utilizar regex do Perl.

Foi útil?

Solução

Este contém um patch para Regexp :: demonstrando Comum um, precisa, testada regex IPv6 completa. A sua tradução em linha reta da gramática IPv6. Regexp :: IPv6 também é preciso.

Mais importante, ele contém um conjunto de testes. Executá-lo com seus programas regex você ainda é um maneiras fora. 10 de 19 desperdiçada. 1 de 12 falsos positivos. IPv6 contém um monte de atalhos especiais que torna muito fácil de obter sutilmente errado.

Melhor lugar para ler sobre o que se passa em um endereço IPv6 é RFC seção 3986 3.2.2.

Outras dicas

O que quer dizer que você não pode apenas usar uma biblioteca? Como cerca de um módulo? Regexp::IPv6 lhe dará o que você precisa.

Eu não sou um especialista IPv6, mas por favor acredite em mim quando digo que a correspondência (e muito menos validando) endereços IPv6 não é fácil com um regex muito simples, como o que você sugere. Há muitos atalhos e várias convenções para combinar o endereço com uma porta, só para citar um exemplo. Um desses taquigrafia é que você pode escrever 0: 0: 0: 0: 0: 0: 0: 1 como :: 1, mas há mais. Se você ler alemão, gostaria de sugerir a olhar para os slides de do Steffen Ullrich talk na 11ª German Perl workshop.

Você diz que você não pode usar uma biblioteca, mas se você estiver indo para reinventar toda a complexidade da biblioteca, então você poderia muito bem apenas importá-lo textualmente em seu projeto.

Este principalmente funciona ...

^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$

Contras: :: como casos não tratados corretamente

Tente isto:

^([0-9a-fA-F]{4}|0)(\:([0-9a-fA-F]{4}|0)){7}$

A partir Expressões Regulares Biblioteca: endereço IPv6

Você também deve ler este: uma expressão regular para endereços IPv6

Se você precisar em cheque perl se uma string é um endereço IPv6, você pode tentar o seguinte:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") };

Tente:

/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/ai

De: http://home.deds.nl/~aeron/regex/

aqui é o que funcionou para todos os exemplos de IPv6 eu conseguiu encontrar:

/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/

Certifique-se que é a única linha antes de usar. ele foi encontrado aqui:

https: //community.helpsystems .com / fóruns / InterMapper / variados-temas / 5acc4fcf-fa83-e511-80cf-0050568460e4

verificada em todos os exemplos da página em questão, a página da comunidade e do site wikipedia a partir daqui:

https://en.wikipedia.org/wiki/IPv6

a ferramenta para a verificação a ser usado a partir daqui:

https://regex101.com/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top