Java中如何按每行起始连字符分割Excel提取的字符串?
解决按Excel单元格中每行起始连字符分割字符串的问题
嘿,我懂你碰到的麻烦了——用Java的split()方法直接切连字符的话,肯定会把字符串里所有的连字符都当成分割点,而不是只认每行开头的那个,对吧?别担心,我给你两个靠谱的解决方案,你可以根据自己的习惯选。
方法一:用多行正则表达式拆分(简洁高效)
核心思路是用正则的多行模式,只匹配每行开头的连字符(包括后面可能跟着的空格),这样就能精准分割出每个参数。
代码示例
import org.apache.poi.ss.usermodel.Cell; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; // 先从Excel单元格获取字符串内容 Cell paramCell = ...; // 你的单元格对象 String cellContent = paramCell.getStringCellValue().trim(); // 多行模式下匹配行首的 "-" 及后续空白字符 String[] paramsArray = cellContent.split("(?m)^-\\s*"); // 转换为ArrayList并过滤空元素(避免拆分后出现空字符串) List<String> paramsList = Arrays.stream(paramsArray) .filter(s -> !s.isBlank()) .collect(Collectors.toList());
正则说明
(?m):开启多行模式,让^符号匹配每一行的开头,而不是整个字符串的开头^-\s*:匹配行首的连字符,加上任意数量的空白字符(空格、制表符都能覆盖)
方法二:先按换行拆分再逐行处理(直观易调试)
如果你对正则不太熟悉,这种分步处理的方式更清晰,也方便你自定义过滤规则(比如跳过非连字符开头的行)。
代码示例
import org.apache.poi.ss.usermodel.Cell; import java.util.ArrayList; import java.util.List; // 获取单元格内容 Cell paramCell = ...; // 你的单元格对象 String cellContent = paramCell.getStringCellValue().trim(); List<String> paramsList = new ArrayList<>(); // 按换行符拆分每行(兼容Windows的\r\n和Linux的\n) String[] lines = cellContent.split("\\r?\\n"); for (String line : lines) { String trimmedLine = line.trim(); // 只处理以 "-" 开头的行 if (trimmedLine.startsWith("-")) { // 去掉开头的 "-" 及后续空白,得到参数内容 String param = trimmedLine.substring(1).trim(); // 跳过空的参数 if (!param.isBlank()) { paramsList.add(param); } } }
为什么之前的split不对?
如果直接用split("-"),它会匹配字符串里所有的连字符,不管是不是在行首——比如参数里如果包含连字符(比如- 用户名-张三),就会被错误拆分。而上面的两种方法都只针对行首的连字符处理,完美解决这个问题。
内容的提问来源于stack exchange,提问作者Radheya
相关产品推荐
相关产品推荐

