webentwicklung-frage-antwort-db.com.de

Extrahieren Sie die IP-Adressen von Strings mit Regex

In einer Anwendung erhalte ich Zeichenfolgen, die IP-Adressen enthalten, aber diese Zeichenfolgen haben kein genaues Format. Alles, was wir wissen, ist, dass diese Zeichenfolgen eine IP-Adresse enthalten können.

hier ist ein Beispiel, wie der String aussehen kann:

  • "XPSPort"
  • IP_10.29.167.187
  • 10.29.166.193

Ich möchte einen Java-Code erhalten, der die IP-Adresse der Zeichenfolge extrahiert, falls vorhanden, oder "" zurückgegeben wird, wenn die Zeichenfolge keine IP-Adresse enthält.

Ich habe diesen Code ausprobiert, aber er funktioniert nicht:

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";
        }

Ich bin mir ziemlich sicher, dass RegExp der beste Weg ist, um das zu erreichen, aber ich bin mit diesen nicht sehr gut. Kann mir jemand helfen, den guten RegExp zu finden?

Danke im Voraus.

12
Padrus

Richards Link hat mir dabei geholfen, die Antwort zu finden.

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";
}
33
Padrus

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}$"

11
Achintya Jha

Überprüfen Sie diese Lösung, um sowohl IPV4- als auch IPV6-Adressen zu überprüfen.

/**
 * 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();
  }
}

source: Bestimmt, ob der angegebene String eine gültige IPv4- oder IPv6-Adresse ist.

9
Pascal

Muster für reguläre Ausdrücke für IP-Adressen: 

^([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])$

Als Referenz mit Beispielen klicken Sie auf hier

0
Rohit Gaikwad