【问题标题】:pattern for matching ipv4 address in Java [duplicate]Java中匹配ipv4地址的模式[重复]
【发布时间】:2013-06-01 12:08:28
【问题描述】:

我需要查找一个字符串(在 Java 中)是否包含 IPv4 地址(它可以出现在任何地方)。 我使用了以下行,但它失败了:

if (token.matches(".[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}") == true) 

这里可能有什么问题。

【问题讨论】:

  • 你可以在这里得到一些help
  • 你也不需要说 == true,那是多余的
  • 你所说的“在任何地方”是什么意思?
  • @fge IP 地址可以是字符串中的任何位置。就像在开始或结束时一样。

标签: java pattern-matching


【解决方案1】:

使用纯正则表达式是可能的,但已经有工具可以检查 IP 地址的有效性。

假设字符串是由空格分隔的标记列表,您可以这样做:

// Crude check
private static final Pattern PATTERN = Pattern.compile("\\d+(\.\\d+){3}");

public boolean containsIPAddress(final String input) 
{
    for (final String candidate: input.split("\\s+")) {
        if (!PATTERN.matcher(candidate).matches())
            continue;
        try {
            InetAddress.getByName(candidate);
            return true;
        } catch (UnknownHostException ignored) {
        }
    }

    return false;
}

使用番石榴,更简单:

private static final Splitter SPLITTER = Splitter.on(' ');

public boolean containsIPAddress(final String input) 
{
    for (final String candidate: SPLITTER.split(input)) {
        if (InetAddresses.isInetAddress(candidate))
            return true;

    return false;
}

【讨论】:

  • 感谢 fge,但问题是 IP 地址可能附加了前缀,例如 /23 或 /32 。所以我需要一个可以匹配字符串中任何地方的模式
【解决方案2】:

斜线方向错误。这不是您可以安全地使用正斜杠而不是反斜杠的文件系统路径。这是正则表达式,所以你必须使用真正的反斜杠 \ 并复制它,因为你正在编写 java 代码:\\

所以,这里是表达式:

token.matches("(?:\\d\\.){1,3}\\d{1,3}")

【讨论】:

  • 我试过了,还是不行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2012-05-17
相关资源
最近更新 更多