如何用正则表达式替代多个contains方法校验Excel中的ID格式合法性?
如何用正则表达式校验并提取合规的ID列表?
你的需求我get到了:从Excel里提取ID数据,要求只能用英文逗号作为分隔符,不能有空格、分号、斜杠这类非法字符,单个ID也算是合法格式,不符合的行直接忽略。
先说说你原来的思路为啥不太靠谱:你用getCellValueAsList按逗号分割后检查列表里有没有分号或空字符串,但这种方式覆盖不全。比如如果单元格内容是"8000 ,7000"(逗号后面带空格),分割后得到的是["8000 ", "7000"],这里面既没有分号也没有空字符串,你的代码会误以为是合法的,但实际上这行有空格,不符合规范;再比如如果单元格里是"8000/7000",分割后是["8000/7000"],你的代码根本查不出来问题。
所以用正则表达式来整体校验单元格的格式是更稳妥的方案,一次性就能把所有非法情况拦下来。
第一步:确定正则表达式
根据你的合规要求,我们可以写出这样的正则:
^[^,;\\s/]+(,[^,;\\s/]+)*$
给你拆解一下每个部分的作用:
^和$:分别匹配字符串的开头和结尾,确保整个单元格内容都符合规则,不会有漏网的非法字符在首尾[^,;\\s/]+:匹配一个或多个不是逗号、分号、空格、斜杠的字符,这就是我们的合法ID(如果你的ID有特定格式,比如必须是数字,可以把这部分换成\\d+,也就是匹配一个或多个数字)(,[^,;\\s/]+)*:匹配零次或多次「逗号+合法ID」的组合,这样既支持单个ID的情况,也支持多个ID用逗号分隔的情况
如果你的ID确定是纯数字,那正则可以更精准:
^\\d+(,\\d+)*$
第二步:代码实现(Java示例)
把正则校验逻辑加到你的代码里,替换原来的判断方式:
while (rows.hasNext()) { TableRow row = rows.next(); String cellValue = row.getCellValue("A"); // 先拿到单元格的原始字符串 // 这里用通用版正则,如果是纯数字ID就换成上面的数字正则 String validPattern = "^[^,;\\s/]+(,[^,;\\s/]+)*$"; // 校验:如果单元格为空,或者不匹配正则,就跳过该行 if (cellValue == null || !cellValue.matches(validPattern)) { REPORT.warn("Incorrect format in row {}", row); continue; } // 格式合法,分割成ID列表 List<String> definitiveMediaToDeleteList = Arrays.asList(cellValue.split(",")); // 这里写你后续处理合法ID列表的逻辑 }
为啥这个方案更好?
- 一次性校验整个字符串的格式,不管是空格、非法分隔符还是错误的分隔方式,都能直接检测出来
- 逻辑更简洁,不用再去检查分割后的列表里有没有奇怪的元素
- 可以根据ID的实际格式灵活调整正则,适配性更强
内容的提问来源于stack exchange,提问作者JhinKazama




