You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Scanner next()读取空令牌问题及IP地址拆分需求

解决Scanner拆分IP地址为整数的问题

我来帮你捋捋用Scanner拆分IP地址时遇到的问题,核心原因主要有两个:分隔符的正则转义误区,以及首尾句点导致的空令牌问题,咱们一步步拆解解决:

1. 第一个坑:分隔符的正则转义错误

你提到设置分隔符模式为".",但这里要注意:在正则表达式里,"."是匹配任意单个字符的通配符,不是字面意义上的句点。如果直接写scanner.useDelimiter("."),Scanner会把任何字符都当作分隔符,完全没法拆分出正确的IP段。

正确的做法是给句点加上双重转义,写成scanner.useDelimiter("\\.")——第一个反斜杠是Java字符串的转义,第二个反斜杠是正则的转义,这样才能精准匹配字面的"."。

2. 第二个坑:首尾句点导致的空令牌

如果你的IP字符串是.192.168.1.1或者192.168.1.1.这种带首尾句点的格式,用\\.作为分隔符的话,Scanner会在开头或结尾拿到空令牌,这时候调用nextInt()就会抛出InputMismatchException,因为空字符串无法转成整数。

解决这个问题有两种实用思路:

  • 预处理字符串:先把IP字符串首尾的句点去掉,再交给Scanner处理
  • 更严谨的分隔符正则:确保只匹配数字之间的句点,自动忽略首尾的无效句点

方案一:预处理字符串 + 正确转义分隔符

代码示例:

import java.util.Scanner;

public class IpSplitDemo {
    public static void main(String[] args) {
        String ip = ".192.168.1.1."; // 带首尾句点的测试IP
        // 预处理:去掉首尾的句点
        String cleanedIp = ip.replaceAll("^\\.|\\.$", "");
        
        Scanner scanner = new Scanner(cleanedIp);
        scanner.useDelimiter("\\.");
        
        try {
            int seg1 = scanner.nextInt();
            int seg2 = scanner.nextInt();
            int seg3 = scanner.nextInt();
            int seg4 = scanner.nextInt();
            System.out.printf("拆分结果:%d, %d, %d, %d%n", seg1, seg2, seg3, seg4);
        } catch (Exception e) {
            System.out.println("IP格式错误:" + e.getMessage());
        } finally {
            scanner.close();
        }
    }
}

方案二:使用精准匹配的分隔符正则

用正则"(?<=\\d)\\.(?=\\d)",这个正则的意思是:只匹配前面是数字、后面也是数字的句点,这样首尾的句点会直接被忽略,不会产生空令牌:

import java.util.Scanner;

public class IpSplitDemo {
    public static void main(String[] args) {
        String ip = ".192.168.1.1.";
        Scanner scanner = new Scanner(ip);
        // 仅匹配数字之间的句点
        scanner.useDelimiter("(?<=\\d)\\.(?=\\d)");
        
        try {
            int seg1 = scanner.nextInt();
            int seg2 = scanner.nextInt();
            int seg3 = scanner.nextInt();
            int seg4 = scanner.nextInt();
            System.out.printf("拆分结果:%d, %d, %d, %d%n", seg1, seg2, seg3, seg4);
        } catch (Exception e) {
            System.out.println("IP格式错误:" + e.getMessage());
        } finally {
            scanner.close();
        }
    }
}

额外提醒:验证IP段合法性

拆分之后最好再加一步验证:确保每个整数都在0-255之间,毕竟合法的IP段不能超出这个范围,避免像300.168.1.1这种无效IP被错误拆分。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:54:11