You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用正则表达式替代多个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

火山引擎 最新活动