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

Java Scanner工具类:如何从字符串中提取特定单词或词组?

嘿,我明白你想从固定格式的字符串里提取特定字段的需求,原来的方法虽然能工作,但确实有更优雅、更稳健的实现方式——毕竟靠手动数next()的次数很容易出错,万一头发颜色变成三个单词(比如light red hair),你的代码就直接失效了😅。下面给你几种靠谱的方案:

方案1:字符串分割(Split)

如果你的输入文本格式完全固定(比如永远是[名字] has [头发描述] and is [身高描述]),用split()方法是最省心的,代码可读性超高:

String input = "Peter has red hair and is very tall";

// 第一步:按" has "分割,拿到名字和剩余内容(限制分割2次避免意外)
String[] nameAndRest = input.split(" has ", 2);
String name = nameAndRest[0];

// 第二步:把剩余内容按" and is "分割,拿到头发颜色和身高
String[] hairAndHeight = nameAndRest[1].split(" and is ", 2);
String hairColor = hairAndHeight[0];
String height = hairAndHeight[1];

// 测试输出
System.out.println(name);       // 输出: Peter
System.out.println(hairColor);  // 输出: red hair
System.out.println(height);     // 输出: very tall

优点:代码简单直观,不用处理复杂的匹配逻辑,只要格式不变就不会出错。
注意点:分割符要加空格(比如用" has "而不是"has"),避免匹配到其他包含"has"的单词(比如"hasn't")。

方案2:正则表达式捕获

如果输入格式有轻微变动(比如头发描述可能是1-3个单词,身高描述也可能更长),正则表达式会更灵活,它能精准捕获我们想要的分组:

String input = "Peter has red hair and is very tall";

// 定义正则:捕获3个分组——名字、头发描述、身高描述
Pattern pattern = Pattern.compile("(\\w+) has (.+?) and is (.+)");
Matcher matcher = pattern.matcher(input);

if (matcher.find()) {
    String name = matcher.group(1);
    String hairColor = matcher.group(2);
    String height = matcher.group(3);

    System.out.println(name);       // 输出: Peter
    System.out.println(hairColor);  // 输出: red hair
    System.out.println(height);     // 输出: very tall
}

正则说明:

  • (\\w+):匹配名字(假设名字是单个单词,要是名字有空格可以改成(.+?)并调整后面的逻辑)
  • (.+?):非贪婪匹配头发描述,直到遇到后面的and is
  • (.+):匹配剩下的所有内容作为身高描述

优点:灵活性强,能适配多种类似格式的输入,不用硬编码分割次数。

方案3:优化Scanner的使用

如果因为某些原因必须用Scanner来处理,也可以优化你原来的思路,避免手动数next()的次数,用正则匹配来定位内容:

Scanner strLine = new Scanner("Peter has red hair and is very tall");

// 读取名字(匹配一个或多个字母/数字)
String name = strLine.findInLine("\\w+");
// 跳过"has"这个单词
strLine.next("has");
// 读取头发描述:匹配到"and"之前的所有内容(正向预查,不包含"and")
String hairColor = strLine.findInLine(".+?(?= and)");
// 跳过"and"和"is"
strLine.next("and");
strLine.next("is");
// 读取剩下的身高描述(注意trim掉开头的空格)
String height = strLine.nextLine().trim();

System.out.println(name);       // 输出: Peter
System.out.println(hairColor);  // 输出: red hair
System.out.println(height);     // 输出: very tall

优点:保留了Scanner的使用场景,但比原来的for循环+手动next更稳健,即使头发描述长度变化也能正确捕获。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:53:57