使用正则表达式从字符串中提取IP地址。

20
在一个应用程序中,我得到了包含 IP 地址的字符串,但是这些字符串没有精确的格式。我们只知道这些字符串可能包含一个 IP 地址。
以下是字符串的示例:
- "XPSPort" - "IP_10.29.167.187" - "10.29.166.193"
我想要获得一段 Java 代码,如果字符串中包含 IP 地址,则提取该地址,否则返回 ""。
我尝试过以下代码但它不起作用:
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";
        }

我相信使用正则表达式是实现这个目标的最佳方式,但我不太擅长它们,所以有人能帮我找到好的正则表达式吗?

提前感谢。


可能是从字符串中提取IP地址的正则表达式的重复问题。 - Richard
1
谢谢Richard,这并不完全是一个重复的问题,因为在我的情况下IP地址并不总是一个完整的单词,但它帮助我找到了答案。 - Padrus
1
记得非捕获组运算符的存在是很好的。但是,你的解决方案给出了比应该有的更多的匹配(19个与13个)。我使用这个正则表达式得到了预期的匹配 ^(?:([01]?[0-9]?[0-9]|25[0-5]|2[0-4][0-9])\.){3}([01]?[0-9]?[0-9]|25[0-5]|2[0-4][0-9])$ (在 https://regex101.com/r/8I7amT/7 尝试一下)。如果你想玩一下,这里有一个 HackerRank 练习:http://hr.gs/dwx - tuxErrante
@bastaPasta,奇怪的是,除了你提供的这个模式之外,这里提到的所有模式,甚至包括作者接受的答案,都对我不起作用!不确定为什么。谢谢。 - xbmono
很高兴能够帮助! - tuxErrante
4个回答

45

Richard的链接帮助我找到了答案。 以下是可用的代码:

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

当给定一个字符串 http://256.225.255.255:8690/AppPortal/ 时,返回的 IP 地址为 56.225.255.255。 - Arundev
7
因为256.255.255.255不是一个有效的IP地址,最大的数字是255。 - Padrus
1
这段代码能够工作的原因是其中没有 ^ 和 $。你原先的正则表达式即使没有那些字符也能够工作。那些符号表示字符串的开头和结尾,因此一个包含这两个符号的正则表达式将不会匹配在字符串中找到的地址。 - Sean F
"0.0.0.256" 不会被识别为有效的 IP 地址,但实际上它并不是。在模式周围添加单词边界可以解决这个问题,代码如下:String IPADDRESS_PATTERN = "\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";" - Shrikant Prabhu

15

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

的意思是匹配IPv4地址的正则表达式。它由四个数字组成,每个数字在0到255之间,并用点分隔。这个正则表达式可以用于验证用户输入的IP地址是否符合标准格式。

10

查看此解决方案以验证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();
  }
}

来源:确定给定字符串是否为有效的IPv4或IPv6地址。


0

IP地址正则表达式模式:

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

如需参考示例,请单击此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接