循环未遍历前置输入反而要求新输入,元音单词替换遇异常
问题根源与修复方案
嘿,这问题太典型啦!你的代码里犯了一个很容易踩的Scanner使用误区:
你在第2行已经通过sc.nextLine()把整句输入读取到textToFormat里了,但后面的while循环却又用sc.hasNext()和sc.next()——这俩方法是从控制台读取新的输入,而不是去处理你已经存在变量里的句子内容,难怪程序会一直要求你新输入!
修复思路
我们需要遍历的是textToFormat里的单词,而不是等待新输入。有两种简单的修复方式:
方式1:用字符串拆分直接处理
把输入的句子拆分成单词数组,然后遍历数组找最长单词:
Scanner sc = new Scanner(System.in); String textToFormat = sc.nextLine(); // 拆分句子为单词(这里用空格拆分,可根据需求调整分隔符) String[] words = textToFormat.split("\\s+"); String longestWord = ""; for (String currentWord : words) { if (currentWord.length() > longestWord.length()) { longestWord = currentWord; } } // 之后就可以用longestWord去替换元音开头的单词啦
方式2:用你已定义的Pattern&Matcher遍历单词
既然你已经初始化了Pattern和Matcher,也可以用它来遍历所有单词,顺便还能提前过滤元音开头的单词(如果需要的话):
Scanner sc = new Scanner(System.in); String textToFormat = sc.nextLine(); // 假设你的regex是匹配单词的正则,比如"\\b\\w+\\b",如果要匹配元音开头可以写成"\\b[aeiouAEIOU]\\w*\\b" Pattern pattern = Pattern.compile("\\b\\w+\\b"); Matcher matcher = pattern.matcher(textToFormat); String longestWord = ""; while (matcher.find()) { String currentWord = matcher.group(); if (currentWord.length() > longestWord.length()) { longestWord = currentWord; } } // 后续替换逻辑
额外说明
如果你的最终需求是把所有元音开头的单词替换成句子里的最长单词,那修复完遍历逻辑后,还可以用Matcher的replaceAll()方法来完成替换,比如:
// 重置Matcher到初始状态,再执行替换 matcher.reset(); String result = matcher.replaceAll(match -> { String word = match.group(); // 判断是否元音开头 if (word.matches("^[aeiouAEIOU].*")) { return longestWord; } return word; });
内容的提问来源于stack exchange,提问作者her0ftheday
相关产品推荐
相关产品推荐

