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
相关产品推荐
相关产品推荐

