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

Java中如何使用正则表达式分割特定格式的尺寸字符串?

正则表达式分割字符串的问题

问题描述

输入字符串:

length 10 cm width 2 cm depth 0.5 cm / length 10 cm width 2 depth 0.5 cm

期望输出:

length 10 cm
width 2 cm / width 2
depth 0.5 cm   

尝试的Java代码:

public static void main(String []args) {
    String s = "length 10 cm width 2 cm depth 0.5 cm";
    String[] tok = s.split("(?<=\\d)\\s");
    for(int i=0; i< tok.length; i++) {
        System.out.println(tok[i]);
    }
}

实际得到的结果:

length 10
cm width 2
cm depth 0.5
cm

需要实现预期的字符串分割效果,该如何调整正则表达式?


解决方案

你的需求是按**属性(length/width/depth)**来分组,而不是单纯按数字后的空格切分。这里提供两种可行思路:

方案1:直接匹配属性片段(推荐)

不用split分割,而是用正则直接匹配每个属性对应的完整内容,包括斜杠后的对应部分:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String s = "length 10 cm width 2 cm depth 0.5 cm / length 10 cm width 2 depth 0.5 cm";
        // 正则规则:匹配属性名 + 数值 + 可选单位 + 可选的斜杠对应属性
        Pattern pattern = Pattern.compile("(length|width|depth)\\s+\\d+(?:\\.\\d+)?\\s*(cm)?(?:\\s+/\\s*(\\1\\s+\\d+(?:\\.\\d+)?\\s*(cm)?))?");
        Matcher matcher = pattern.matcher(s);
        
        while (matcher.find()) {
            StringBuilder line = new StringBuilder();
            // 先拼接左边的属性内容
            line.append(matcher.group(1)).append(" ").append(matcher.group(0).split("\\s+/\\s+")[0].split("\\s+", 2)[1]);
            // 如果有斜杠后的对应属性,追加进去
            if (matcher.group(3) != null) {
                line.append(" / ").append(matcher.group(3));
            }
            System.out.println(line);
        }
    }
}

运行后输出完全符合预期:

length 10 cm
width 2 cm / width 2
depth 0.5 cm

方案2:调整split的分割规则

如果坚持用split,可以把分割点设在属性名前的空格(排除开头的属性),正则用(?=\\s+(length|width|depth)),意思是“分割后面跟着空格+属性名的位置”,再合并斜杠前后的内容:

public static void main(String []args) {
    String s = "length 10 cm width 2 cm depth 0.5 cm / length 10 cm width 2 depth 0.5 cm";
    // 先按斜杠把字符串分成左右两部分
    String[] parts = s.split("\\s+/\\s+");
    String left = parts[0];
    String right = parts[1];
    
    // 分别按属性分割左右两边
    String[] leftAttrs = left.split("(?=\\s+(length|width|depth))");
    String[] rightAttrs = right.split("(?=\\s+(length|width|depth))");
    
    // 逐行合并对应属性
    for (int i = 0; i < leftAttrs.length; i++) {
        StringBuilder line = new StringBuilder(leftAttrs[i].trim());
        if (i < rightAttrs.length) {
            line.append(" / ").append(rightAttrs[i].trim());
        }
        System.out.println(line);
    }
}

这个方案先拆分左右段,再各自按属性分割后合并,也能得到目标输出。


关键思路

核心是抓住属性的固定结构:每个片段都以length/width/depth开头,后面跟着数值和可选单位。之前的错误在于只盯着数字后的空格切分,没考虑属性的边界。不管是匹配还是分割,都要围绕这个属性结构来设计规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:22:46