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

Java中如何将字符串拆分数字(含小数)与普通字符并存入数组?

解决方案:拆分字符串为数字(含小数)与普通字符

问题分析

你需要将字符串拆分为完整数字片段(包括带逗号/点的小数)和普通字符片段,但原正则表达式的拆分逻辑错误——它会在单个数字前触发拆分,导致数字被拆分为单个字符。以下提供两种可靠实现方式:


方法1:正则匹配(推荐,逻辑更直观)

直接匹配所有符合要求的数字和非数字片段,避免拆分逻辑的歧义。

正则规则说明

\d+(?:[.,]\d+)?|[^0-9]+

  • \d+(?:[.,]\d+)?:匹配整数(如600)或带逗号/点的小数(如1,54、.300),(?:...)为非捕获组,避免生成无用分组
  • [^0-9]+:匹配连续的非数字字符(如bacon、g)

代码实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class HelloWorld {
    public static void main(String[] args) {
        String[] Words = {"bacon", "1,54g", "eggs", "600g", "jalapeno.300g"};
        Pattern pattern = Pattern.compile("\\d+(?:[.,]\\d+)?|[^0-9]+");
        
        for (String word : Words) {
            Matcher matcher = pattern.matcher(word);
            List<String> parts = new ArrayList<>();
            while (matcher.find()) {
                String part = matcher.group();
                if (!part.isEmpty()) {
                    parts.add(part);
                }
            }
            System.out.println(word);
            System.out.println(Arrays.toString(parts.toArray(new String[0])));
        }
    }
}

输出结果

bacon
[bacon]
1,54g
[1,54, g]
eggs
[eggs]
600g
[600, g]
jalapeno.300g
[jalapeno, .300, g]

方法2:调整Split正则(适合坚持用Split的场景)

通过匹配数字与非数字的边界实现拆分,确保数字片段的完整性。

正则规则说明

(?<=\\d)(?=[^0-9])|(?<=[^0-9])(?=(?:\\d+[.,]\\d+|\\d+|\\.\\d+))

  • (?<=\\d)(?=[^0-9]):在数字结尾、非数字开头的位置拆分(如600g → 600和g之间)
  • (?<=[^0-9])(?=(?:\\d+[.,]\\d+|\\d+|\\.\\d+)):在非数字结尾、完整数字开头的位置拆分(如jalapeno.300g → jalapeno和.300之间)

代码实现

import java.util.Arrays;

class HelloWorld {
    public static void main(String[] args) {
        String[] Words = {"bacon", "1,54g", "eggs", "600g", "jalapeno.300g"};
        String splitRegex = "(?<=\\d)(?=[^0-9])|(?<=[^0-9])(?=(?:\\d+[.,]\\d+|\\d+|\\.\\d+))";
        
        for (String word : Words) {
            String[] splitWord = word.split(splitRegex);
            System.out.println(word);
            System.out.println(Arrays.toString(splitWord));
        }
    }
}

输出结果

bacon
[bacon]
1,54g
[1,54, g]
eggs
[eggs]
600g
[600, g]
jalapeno.300g
[jalapeno, .300, g]

原代码问题总结

原正则(?=\\d+[.,]\\d+|\\d+)会在每个单个数字的前触发拆分(如600会在6、0、0前分别拆分),导致数字被拆分为单个字符。而你尝试的[0-9]+[.,][0-9]+|[0-9]+是匹配数字的规则,不能直接用于split(split会将匹配内容作为分隔符,导致丢失数字部分)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:05:19