2013-04-08 13 views
10

W aplikacji otrzymuję ciągi zawierające adresy IP, ale te ciągi nie mają dokładnego formatu. Wszystko, co wiemy, to że te ciągi mogą zawierać adres IP.Wyodrębnianie adresów IP z ciągów znaków za pomocą wyrażeń regularnych

tutaj jest przykładem tego, co łańcuch może wyglądać następująco:

  • "XPSPort"
  • "IP_10.29.167.187"
  • "10.29.166.193"

bym jak uzyskać kod Java, który wyodrębnia adres IP ciągu, jeśli jest taki lub który zwraca "", jeśli ciąg nie zawiera adresu IP.

Próbowałem ten kod, ale to nie działa:

String IPADDRESS_PATTERN = 
     "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
     "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
     "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
     "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; 

Pattern pattern = Pattern.compile(IPADDRESS_PATTERN); 
Matcher matcher = pattern.matcher(ipString); 
     if (matcher.find()) { 
      return matcher.group(); 
     } 
     else{ 
      return "0.0.0.0"; 
     } 

jestem całkiem pewny użyciu RegExp jest najlepszym sposobem, aby to osiągnąć, ale nie jestem z nich bardzo dobre więc może ktoś mi pomóc znaleźć dobre RegExp?

Z góry dziękuję.

+0

możliwe duplikat [regex adresu IP, z ciągiem] (http://stackoverflow.com/questions/8439633/regex-ip-address-from-string) – Richard

+1

Dzięki Richard, to nie jest dokładnie duplikat, ponieważ w moim c aza IP nie zawsze jest pełne słowo, ale pomógł mi znaleźć odpowiedź. – Padrus

Odpowiedz

27

Link Richard pomógł mi znaleźć odpowiedź. oto kod działa:

String IPADDRESS_PATTERN = 
     "(?:(?: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]?)"; 

Pattern pattern = Pattern.compile(IPADDRESS_PATTERN); 
Matcher matcher = pattern.matcher(ipString); 
if (matcher.find()) { 
    return matcher.group(); 
} else{ 
    return "0.0.0.0"; 
} 
+0

Po podaniu ciągu znaków http://256.225.255.255:8690/AppPortal/ zwrócony adres IP to 56.225.255.255. – Arundev

+5

to dlatego, że 256.255.255.255 nie jest prawidłowym adresem IP, maksymalna liczba to 255. – Padrus

+1

Powodem tego działania jest brak^i $. Twoje oryginalne wyrażenie regularne też by działało bez tych znaków. Te znaki oznaczają początek i koniec ciągu znaków, dlatego wyrażenie zawierające je nie będzie pasowało do adresu znalezionego w ciągu znaków. –

11

IPV4_PATTERN = "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$"

9

Sprawdź to rozwiązanie do sprawdzania zarówno IPv4 & IPv6.

/** 
* This class provides a variety of basic utility methods that are not 
* dependent on any other classes within the org.jamwiki package structure. 
*/ 
public class Utilities { 
    private static Pattern VALID_IPV4_PATTERN = null; 
    private static Pattern VALID_IPV6_PATTERN = null; 
    private static final String ipv4Pattern = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])"; 
    private static final String ipv6Pattern = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}"; 

    static { 
    try { 
     VALID_IPV4_PATTERN = Pattern.compile(ipv4Pattern, Pattern.CASE_INSENSITIVE); 
     VALID_IPV6_PATTERN = Pattern.compile(ipv6Pattern, Pattern.CASE_INSENSITIVE); 
    } catch (PatternSyntaxException e) { 
     //logger.severe("Unable to compile pattern", e); 
    } 
    } 

    /** 
    * Determine if the given string is a valid IPv4 or IPv6 address. This method 
    * uses pattern matching to see if the given string could be a valid IP address. 
    * 
    * @param ipAddress A string that is to be examined to verify whether or not 
    * it could be a valid IP address. 
    * @return <code>true</code> if the string is a value that is a valid IP address, 
    * <code>false</code> otherwise. 
    */ 
    public static boolean isIpAddress(String ipAddress) { 

    Matcher m1 = Utilities.VALID_IPV4_PATTERN.matcher(ipAddress); 
    if (m1.matches()) { 
     return true; 
    } 
    Matcher m2 = Utilities.VALID_IPV6_PATTERN.matcher(ipAddress); 
    return m2.matches(); 
    } 
} 

źródło: Determine if the given string is a valid IPv4 or IPv6 address.

0

Adres IP Regular Expression Wzór:

^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\. 
([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$ 

Dla porównania z przykładami kliknij here

Powiązane problemy