scanner.skip()用于跳过输入流中不关心的前导内容,只移动读取位置而不消费字符,匹配失败抛inputmismatchexception;需用try-catch保护,不改变分隔符,正则默认从当前位置锚定匹配。

skip() 的核心行为:跳过,但不消费“成功匹配后的下一个字符”
比如输入是 "
123"(开头多个空白),执行:
scanner.skip("\s*");
它会跳过所有开头的空白,光标停在 '1' 前——下次调用 nextInt() 或 next() 就能直接读到 123。
⚠️ 注意:skip() 不会吞掉第一个非空白字符,只是把读取位置“推到那里”。
常用噪音场景与正则写法
-
跳过所有前导空白(含 Unicode 空格、NBSP):
scanner.skip("\p{Z}+"); 或更稳妥的 scanner.skip("\s+"); -
跳过 C/Java 风格单行注释(// ... 换行前):
scanner.skip("//[^\r\n]*[\r\n]?"); -
跳过 UTF-8 BOM(uFEFF)或 Windows 行结束符混合噪音:
scanner.skip("\uFEFF|\r\n|\r|\n");(可加*支持连续出现) -
跳过特定分隔符前的任意噪音(如跳过 "data:" 后的空格和冒号):
scanner.skip("data:\s*"); —— 这样后续nextLine()就从真正数据开始
必须配合 useDelimiter() 或手动容错
单独靠 skip() 无法解决“中间混杂噪音”的问题。例如输入:
"name: Alice age: 30 city: Beijing"
你想提取 Alice、30、Beijing,仅用 skip("name:\s*") 只能跳到 Alice 前;之后还得用 next() 读值,再 skip("age:\s*")……容易断裂。
✅ 更稳的做法:
scanner.useDelimiter("\s*[:\s]+\s*");
然后循环 scanner.hasNext() + scanner.next(),自动切分并忽略分隔符周围的噪音。
安全使用的三个提醒
- 始终用 try-catch 包裹 skip():没匹配到就抛异常,别让它崩掉程序;可以 catch 后按默认逻辑处理(比如认为噪音不存在,继续读)
-
skip() 不改变 delimiter:它和
useDelimiter()是两套机制,别以为设了 delimiter 就不用 skip 了——前者管“怎么切”,后者管“开头清场” -
正则要锚定开头(隐式):
skip("abc")只匹配当前位置开始的"abc",不会往回找;所以它适合做“前导清理”,不适合“全局过滤”










