Java分割字符串为数组时如何保留单词内部的空格
Java字符串分割(保留内容内部空格)实现方案
问题背景
开发中存在如下场景:字符串内部分空格属于有效内容的组成部分,直接按空格分割会破坏原有内容结构。
本次待处理的目标字符串:
String phoneNumbers = "987-123-4567 123 456 7890 (123) 456-7890";
预期转换得到的字符串数组:
String[] numbers = {"987-123-4567", "123 456 7890", "(123) 456-7890"};
初始错误实现为直接按空格分割:
String[] array = phoneNumbers.split(" ");
该实现的错误输出如下,把号码内部的空格也当成了分隔符:
[987-123-4567, 123, 456, 7890, (123), 456-7890]
正确实现思路
split方法的核心是识别统一的分隔符做切割,当分隔符(空格)同时作为有效内容存在时,该方法无法区分边界,因此改用正则匹配提取目标子串的方案:直接识别所有符合电话号码格式的片段,无需额外判断空格属于分隔符还是内容。
实现代码
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PhoneNumberParser { public static void main(String[] args) { String phoneNumbers = "987-123-4567 123 456 7890 (123) 456-7890"; // 正则覆盖三类常见电话号码格式:横杠分隔纯数字、空格分隔纯数字、带区号括号的格式 Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}|\\d{3} \\d{3} \\d{4}|\\(\\d{3}\\) \\d{3}-\\d{4}"); Matcher matcher = phonePattern.matcher(phoneNumbers); List<String> numberList = new ArrayList<>(); while (matcher.find()) { numberList.add(matcher.group()); } String[] numbers = numberList.toArray(new String[0]); // 结果验证 for (String number : numbers) { System.out.println(number); } } }
运行结果
执行代码后输出完全符合预期:
987-123-4567 123 456 7890 (123) 456-7890
扩展说明
- 如果后续出现新的电话号码格式,只需要在正则表达式中追加对应的格式规则即可,不需要调整整体逻辑
- 该思路同样适用于其他「分隔符和内容字符重合」的字符串提取场景,比强行定义复杂的split分隔规则稳定性更高
内容的提问来源于stack exchange,提问作者Orest Dymarchuk
相关产品推荐
相关产品推荐

