Scanner.skip()用于跳过输入流中开头连续匹配正则的部分,匹配成功则移动位置,失败抛NoSuchElementException;适用于行首固定前缀(如日志标记),不适用于分散噪音。

Scanner.skip() 的作用不是“过滤噪音”,而是主动跳过输入流中匹配正则表达式的前缀部分,它不返回值、不消耗后续内容(除非匹配成功)、也不影响后续 nextXxx() 的读取位置——前提是跳过成功。它常被误用为“跳过非法字符”,但实际使用需谨慎:跳过失败会抛 NoSuchElementException,且它只跳**开头连续匹配**的部分,不能反复跳过分散的噪音。
skip() 的核心行为与适用场景
它等价于“尝试从当前位置开始,贪婪匹配一次给定正则,并将扫描器位置移到匹配结束处”。例如:
- 输入是
" 123abc456",调用scanner.skip("\s*")→ 跳过开头所有空格,位置移到'1'处; - 接着调用
scanner.nextInt()→ 成功读出123; - 但若输入是
"abc123",调用scanner.skip("\d+")→ 匹配失败,抛异常。
跳过行首/行间固定格式噪音(推荐用法)
适合处理日志、配置片段等有规律前缀的场景。例如每行以 [INFO] 或空格缩进开头:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 先
scanner.skip("\[INFO\]|\s*");再scanner.nextLine(),可忽略日志级别标记; - 更安全写法:用
hasNext(Regex)预检再 skip:if (scanner.hasNext("\s*")) scanner.skip("\s*");
跳过非目标字段(需配合 delimiter 或手动控制)
skip() 本身不支持“跳过中间某段”,但可组合使用:
立即学习“Java免费学习笔记(深入)”;
- 设分隔符为逗号:
scanner.useDelimiter(","); - 对每个 token,先 skip 掉可能的空白或引号:
scanner.skip("["\s]*"); - 再用
scanner.next()读主体,最后 skip 结尾噪音:scanner.skip("["\s]*");
替代方案:用 hasNext() + next() 主动丢弃,更可控
当噪音不连续或规则复杂时,skip() 易失败。建议改用循环跳过:
while (scanner.hasNext("\s+|//.*|/\*.*?\*/")) scanner.next();- 再调用
scanner.nextXXX()读目标数据; - 注意正则要加
Pattern.DOTALL支持跨行注释(需用scanner.usePattern(...)设置)。

















