expressão regular para selecionar endereços IP

0

Ajude-me a escrever uma expressão regular que selecione linhas que começam em 192 e terminem com 2 ou 002 ?
Eu quero obter uma lista de endereços IP, eles podem consistir em 192.168.001.002 , 192.168.001.2 , 192.168.1.002 ou 192.168.1.2 tipos, mas eu quero escolher apenas de acordo com a minha regra.

Eu fiz assim:

(\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3})

mas como encontrar as linhas para começar e terminar com determinados dígitos?

atualizar

(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})

Funciona bem, mas seleciona uma string desnecessária 192.168.027.021

    
por Pavel Fedorov 24.02.2018 / 16:54

2 respostas

1

Se você quiser que o IP comece com 192 , adicione-o no início da regex:

192\.\d{3}\.\d{1,3}\.[02]{1,3}

Você quer que isso termine com 002 ou 2 , o uso:

192\.\d{3}\.\d{1,3}\.(00)?2

onde (00)? significa dois zeros opcionais.

    
por 24.02.2018 / 18:03
1

Resumindo e esclarecendo a pergunta e os objetivos:

  • Objetivo: obter uma lista de endereços IP que começam com 192 e terminam com 2 ou 002
  • Consiste em: 192.168.001.002 , 192.168.001.2 , 192.168.1.002 ou %código%
  • Tentei: 192.168.1.2
  • Atualizado: (\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3}) - funciona, mas seleciona uma string desnecessária (\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})

Provavelmente o que você quer é:

  • 192.168.027.021
  • Selecionar string grep -P "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
  • (Get-Content ip.txt) "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt

Se você realmente quer apenas '192' como o primeiro octeto, então faça isso literalmente:

-match "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b"

Se você quiser apenas padrões de IP que terminem com apenas 0 ou 2 no último octeto, eles também funcionarão (os 3 padrões são os mesmos):

  • Select-String "\b192\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
  • Selecionar string grep -P "\b(\d{1,3}\.){3}[02]{1,3}\b" ip.txt
  • (Get-Content ip.txt) "\b(\d{1,3}\.){3}[02]{1,3}\b" ip.txt

Um a três dígitos, em seguida, um -match "\b(\d{1,3}\.){3}[02]{1,3}\b" , três vezes, depois, 1-3 . ou 0 caracteres, com uma quebra de 'palavra' antes & depois.

Depende da ferramenta Regex que você está usando, mas testarei com 2 (compatível com PCRE / perl) ou com o PowerShell / .net, que é bastante semelhante.

Seu primeiro Regex: grep -P diz:

  1. Encontre 3 dígitos e um literal (\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3}) (ponto)
  2. Seguido por: 3 dígitos e um literal . (ponto)
  3. Seguido de: 1 a 3 dígitos e um literal . (ponto)
  4. Seguido por: 1 a 3 dígitos

Os parênteses são desnecessários, a menos que você queira quantificar grupos ou usá-los em uma substituição ou referência anterior.

Ele não diz nada sobre isso ter que ser "no começo ou no final da string / linha - provavelmente Ok, mas se eles estão embutidos em um texto, pode não ser uma suposição exata.

Sua segunda tentativa . é semelhante, exceto pela quarta parte (\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3}) , que diz:

  • Encontre ([02]{1,3}) ou 0 uma a três vezes.

... então sim, ele será igual quando o final for 2 - que é 021 e não há nada a dizer "deve estar no final ou na linha ou o próximo caractere não pode ser um dígito (isso não é ' t a 02 ou 0 ).

Você precisa "ancorar" seu regex para isso - fixá-lo ao final da linha, ao texto literal ou a uma "quebra de palavra", etc.

Mais simples e talvez mais geral é a âncora "quebra de palavras": \ b

É uma afirmação de largura zero (não corresponde a nenhum caractere real, mas afirma / exige que algo seja verdadeiro, a transição de 'caracteres de palavra' para caracteres que não são de palavras.)

  • Seu: 2
  • Corrigido: grep -P "(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})\b" ip.txt
  • simplificado: grep -P "\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
por 24.02.2018 / 20:04