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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:42:56