我需要查找一个字符串(在 Java 中)是否包含 IPv4 地址(它可以出现在任何地方)。我使用了以下行,但它失败了:
if (token.matches(".[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}") == true)
这里有什么问题。
我需要查找一个字符串(在 Java 中)是否包含 IPv4 地址(它可以出现在任何地方)。我使用了以下行,但它失败了:
if (token.matches(".[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}/..[0-9]{1,3}") == true)
这里有什么问题。
为此使用纯正则表达式是可能的,但已经有工具可以检查 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;
}
斜线的方向是错误的。这不是您可以安全地使用正斜杠而不是反斜杠的文件系统路径。这是正则表达式,因此您必须使用真正的反斜杠\
并复制它,因为您正在编写 java 代码:\\
所以,这里是表达式:
token.matches("(?:\\d\\.){1,3}\\d{1,3}")