c#
  • .net
  • regex
  • 2011-02-03 200 views 28 likes 
    28

    Intento extraer el valor (dirección IP) del wan_ip con este código fuente: ¿Qué sucede? Estoy seguro de que el patrón RegEx es correcto.RegEx para una dirección IP

    String input = @"var product_pic_fn=;var firmware_ver='20.02.024';var wan_ip='92.75.120.206';if (parent.location.href != window.location.href)"; 
    Regex ip = new Regex(@"[\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"); 
    string[] result = ip.Split(input); 
    
    foreach (string bla in result) 
    { 
        Console.WriteLine(bla);     
    } 
    
    Console.Read(); 
    
    +4

    Dejando a un lado la expresión, ¿no debería estar mirando 'Regex.Matches' en lugar de' Split'? – Ani

    +0

    posible duplicado de [¿Expresión regular para coincidir con el nombre de host o la dirección IP?] (Http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address) –

    +6

    '999.999.999.999' ? – Andrey

    Respuesta

    32

    El [ no debe estar al principio de su patrón. Además, es probable que desee utilizar Matches(...).

    Probar:

    String input = @"var product_pic_fn=;var firmware_ver='20.02.024';var wan_ip='92.75.120.206';if (parent.location.href != window.location.href)"; 
    Regex ip = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"); 
    MatchCollection result = ip.Matches(input); 
    Console.WriteLine(result[0]); 
    
    +1

    @ h0scHberT, si la sugerencia de @ John funciona, iría por eso. Si no, pruebe el código de @ SwDevMan81: parece más seguro verificar primero si hay una coincidencia. Mi sugerencia (rápida) probablemente producirá errores si no hay coincidencia (soy un poco novato en C# ...). –

    +0

    ¡Gracias! ¡Funciona! – h0scHberT

    +0

    No funciona para un caso si el IP está en 192.168.1.15_1 – Jay

    0

    Creo que se necesita para deshacerse de los botones [- es que un personaje callejero o qué?

    Regex (@ "[ \ b \ d {1,3}. \ D {1,3}. \ D {1,3}. \ D {1,3} \ b")

    0

    Parece que tiene un extraño [ al principio de su patrón de expresión regular.

    13

    Prueba esto:

    Match match = Regex.Match(input, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"); 
    if (match.Success) 
    { 
        Console.WriteLine(match.Value); 
    } 
    
    +0

    Se está encargando del caso 192.168.1.15_1 .. +1 – Jay

    +2

    192.168.1.15_1? ¿Por qué necesito considerarlo? –

    5

    Si alguna vez se encuentra en busca de una expresión regular, http://regexlib.com/ tiene un montón de expresiones regulares en formato de biblioteca.

    3
    Regex.IsMatch(input, @"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$") 
    
    +8

    ¿Por qué respondería a una pregunta ya respondida más de un año después de que se le preguntó con una solución que no funciona? La pregunta era sobre extraer una subcadena: su solución solo coincide con una cadena exacta, y agrega absolutamente _nothing_ a las respuestas anteriores. –

    +0

    Exactamente lo que estaba buscando. ¡Gracias! – Boris

    24

    muy antiguo puesto, se debe utilizar la solución aceptada, pero considerar el uso de la expresión regular correcta para una dirección IPv4:

    ((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]?) 
    

    Si se quiere evitar carácteres especiales después o beforeyou puede utilizar:

    ^((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]?)$ 
    
    +3

    Esta debería ser la solución aceptada –

    +0

    Se ve bien, pero cuando la uso, también coincide si agrego caracteres inválidos a una dirección IP válida – copa017

    +1

    Tiene razón, los prefijos y sufijos de soporte de expresiones regulares, edito mi respuesta. – JPBlanc

    2

    Evitar el uso de /b - que permite a los personajes antes o después del PI
    Por ejemplo ...198.192.168.12... era válido.

    Use ^ y $ en su lugar si puede dividir la entrada en fragmentos que aislarían la dirección IP.

     Regex regexIP = new Regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"); 
    
        if (regexIP.Match(textBoxIP.Text).Success){ 
         String myIP = textBoxIP.Text; 
        } 
    

    Nota anterior no validará los dígitos, como se ha señalado 172. .254.1 era cierto. Esto solo verifica el formateo correcto.


    ACTUALIZACIÓN: Para validar el formateo y los valores que se podría utilizar

     Regex regexIP = new Regex(@"^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$"); 
    
        if (regexIP.Match(textBoxIP.Text).Success){ 
         String myIP = textBoxIP.Text; 
        } 
    

    (nota usando ([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]) para cada valor numérico)
    Crédito: https://stackoverflow.com/a/10682785/4480932

    +0

    este vuelve verdadero para 172.316.254.1 –

    +1

    Gracias por señalar eso. Carl91 - He actualizado mi respuesta para dar cuenta de eso. – Cordell

    2

    Sé que este mensaje ISN' Es nuevo, pero he probado varias de las soluciones propuestas y ninguna de ellas funciona tan bien como una que encontré gracias a un enlace proporcionado por Justin Jones. Tienen bastantes direcciones IP, pero esta es la parte superior de la lista y, al utilizar LinqPad (I LOVE LinqPad), la mayoría de las pruebas que he realizado funcionan muy bien.Yo recomiendo la utilización de éste en lugar de cualquiera de las expresiones proporcionadas anteriores:

    ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$ 
    

    Dale que un tiro en LINQPad con lo siguiente:

    // \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b 355.168.0.1 = 355.168.0.1 (Not Correct) 
    // ((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]?) 355.168.0.1 = 55.168.0.1 (Not correct) 
    // \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 355.168.0.1 = 355.168.0.1 (Not Correct) 
    // ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ 355.168.0.1 = 355.168.0.1 (Not Correct) 
    // ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ 355.168.0.1 = 355.168.0.1 (Not Correct) 
    // ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$ 355.168.0.1 = No Match (Correct) 
    
    Match match = Regex.Match("355.168.0.1", @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$"); 
    if (match.Success) { 
        Console.WriteLine(match.Value); 
    } 
    else { 
        Console.WriteLine("No match."); 
    } 
    

    Con el nuevo RegEx esto no es válido que es correcta: 355.168.0.1 = Sin coincidencia, que es correcta como se indica en los comentarios.

    Doy la bienvenida a los ajustes a esto ya que estoy trabajando en una herramienta que está haciendo uso de la expresión y siempre estoy buscando mejores formas de hacerlo.

    ACTUALIZACIÓN: He creado un proyecto .NET Fiddle para proporcionar un ejemplo de trabajo de esta expresión junto con una lista de direcciones IP que prueban varios valores. Siéntete libre de jugar con él y prueba varios valores para ejercitar esta expresión y proporciona cualquier entrada si encuentras un caso donde la expresión falla. https://dotnetfiddle.net/JoBXdI

    ACTUALIZACIÓN 2: Mejor aún referirse a este mensaje: Another related question.

    Gracias y espero que esto ayude!

    +0

    Este devuelve falso para "0.254.255.0" –

    0

    Regex (@ "\ A \ d {1,3}. \ D {1,3}. \ D {1,3}. \ D {1,3} \ z") intente con este

    +0

    Esto no funciona correctamente, vea mi enlace al violín de .NET anterior, he agregado esta expresión a la lista de pruebas. –

    0

    Tomé este patrón de UrlAttribute.cs. en el espacio de nombres de DataAnnotaciones. Como puede ver, tomé solo una parte del patrón original de la fuente.

    Regex.IsMatch(input, @"^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1- 
    9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1- 
    9]\d|1\d\d|2[0-4]\d|25[0-5])$"); 
    
    +0

    Explíquelo, para que proporcione valor a aquellos que realmente buscarían esta pregunta. Para aquellos que entienden su código sin explicación, la solución ya sería obvia. – jpaugh

    +0

    Esto funciona correctamente según las pruebas al usar mi proyecto .NET Fiddle. No estoy 100% seguro de cuáles son las grandes diferencias entre esto y mi expresión. –

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

    Comprobar esto. Debería funcionar perfectamente

    +0

    Lo siento, esto no funciona. Compruebe mi proyecto .NET Fiddle vinculado en mi respuesta - He añadido esta expresión a la lista. Puedes comentar el mío, des-comentar el tuyo y notar que no funciona como se esperaba. –

    Cuestiones relacionadas