Eu escrevo Perl um código de liner para corresponder ao endereço IP de acordo com a seguinte regra:
corresponder apenas aos três primeiros octetos, enquanto os quatro octetos devem ser válidos de 0 a 255, além desse número ou "."não deve existir antes do primeiro octeto e número ou "."não deve existir também após os quatro octetos
exemplo
export IP=100.187.34
exemplo de IP "s que devem corresponder
:100.187.34.12:.10
IP=100.187.34.100$
AAA100.187.34.199BBB
address:100.187.34.210+
exemplo de IPs que não devem corresponder
55.100.187.34.99
.100.187.34..
100.187.34.100.1
100.187.34.2100
1.100.187.34
100.187.34.1.1
então esse é o meu código (não funciona de acordo com minhas regras):
echo [...]xxx.xxx.xxx.xxx[...] | perl -pe "print if /(?<![d.])Q$ENV{IP}E(?=.(?:1?d?d|2[0-4][0-9]|25[0-5])(?!d))/; "
o problema é que meu código corresponde quase a qualquer número
por favor, informe o que preciso corrigir no meu código para corresponder aos IPs apenas de acordo com as regras
Respostas:
1 para resposta № 1Aqui estão alguns exemplos de correspondência de regexp IP do Livro de Receitas de Expressões Regulares de O "Reilly":
Regex simples para procurar um endereço IP:
^(?:[0-9]{1,3}.){3}[0-9]{1,3}$
Regex preciso para procurar um endereço IP:
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}↵
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Regex simples para extrair endereços IP de texto mais longo:
b(?:[0-9]{1,3}.){3}[0-9]{1,3}b
Regex preciso para extrair endereços IP de texto mais longo:
b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}↵
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b
Regex simples que captura as quatro partes do endereço IP:
^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$
Regex preciso que captura as quatro partes do endereço IP:
^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).↵
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).↵
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).↵
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
0 para resposta № 2
perl -e "$v=quotemeta($ENV{IP});print if /$v.(?:1?d?d|2[0-4][0-9]|25[0-5])(?!d)/?1:0"