Java正则split()问题:无字母输入时如何得到空数组?
解决Java分割字符串时全非字母输入返回空数组的问题
嘿,我来帮你搞定这个问题!你的代码现在遇到的情况,是因为当输入全是非字母字符时,经过replaceAll和trim处理后得到了空字符串,而Java的String.split("\\s+")方法对空字符串的默认返回是一个包含单个空字符串的数组,这就导致了你看到的结果。
下面给你两种可行的修改方案:
方案一:先判断处理后的字符串是否为空
我们可以在分割之前先检查处理后的字符串s1是否为空,如果是空的话直接返回空数组,否则再执行分割操作。修改后的代码如下:
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s = scan.nextLine(); String s1 = s.replaceAll("[^a-zA-Z]", " ").trim(); String[] word; // 检查处理后的字符串是否为空 if (s1.isEmpty()) { word = new String[0]; // 初始化空数组 } else { word = s1.split("\\s+"); } System.out.println(word.length); for(String item : word) { System.out.println(item); } scan.close(); } }
这个方案逻辑清晰,和你原来的代码结构改动不大,很容易理解。当输入全是非字母时,s1会变成空字符串,我们直接给word赋值一个空数组,这样输出的长度就是0,也不会打印任何空字符串。
方案二:直接分割+过滤空字符串(更简洁)
我们可以换一种思路,直接用非字母字符作为分隔符分割原字符串,然后过滤掉分割后产生的空字符串。这样一步到位,代码更简洁:
import java.io.*; import java.util.*; import java.util.stream.*; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s = scan.nextLine(); // 按非字母字符分割,然后过滤空字符串 String[] word = Arrays.stream(s.split("[^a-zA-Z]+")) .filter(str -> !str.isEmpty()) .toArray(String[]::new); System.out.println(word.length); for(String item : word) { System.out.println(item); } scan.close(); } }
这里用[^a-zA-Z]+作为分隔符,把所有连续的非字母字符当作分割标记。然后通过Java Stream的filter方法去掉所有空字符串,最后转成数组。不管输入是全非字母、开头/结尾带非字母,都能得到只包含有效字母单词的数组,全非字母输入时自然就返回空数组了。
内容的提问来源于stack exchange,提问作者Ganesh Marathe
相关产品推荐
相关产品推荐

