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
相关产品推荐
相关产品推荐

