You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取正则表达式test()测试失败的首个无效字符?

如何返回导致字符校验失败的首个无效字符?

我现在用下面这个函数检查输入是否包含无效字符:当输入存在被排除的字符时,正则的test()会返回false,此时函数返回true表示有无效字符。现在想改成返回第一个导致校验失败的无效字符,请问该怎么做?

function isContainInvalidCharacter(str) {
    //--- Allowable characters in string a-z, A-Z, 0-9, Space @,.$)\/(-%:
    if ( /^[A-Za-z0-9\p{sc=Hani}\s,.@$)\/(%:-]+$/u.test(str) == false) {
        return true;
    } else
        return false;
}

解决思路

原正则是校验所有字符都属于允许集合,要定位第一个无效字符,只需要反过来匹配单个不属于允许集合的字符,用正则的exec()方法即可直接拿到第一个匹配的结果。

注意:要保留u修饰符以支持Unicode(比如原正则中的中文匹配),同时确保反向字符集里的特殊符号位置正确(比如-放在字符集末尾无需转义)。

修改后的代码

直接改写函数,让它在存在无效字符时返回第一个无效字符,无无效字符则返回null:

function findFirstInvalidCharacter(str) {
    // 匹配第一个不属于允许集合的字符
    const invalidCharRegex = /[^A-Za-z0-9\p{sc=Hani}\s,.@$)\/(%:-]/u;
    const matchResult = invalidCharRegex.exec(str);
    return matchResult ? matchResult[0] : null;
}

使用示例

console.log(findFirstInvalidCharacter("Hello!World")); // 输出 "!"
console.log(findFirstInvalidCharacter("你好@123")); // 输出 null
console.log(findFirstInvalidCharacter("Test#123")); // 输出 "#"

补充扩展

如果需要保留原函数的布尔返回逻辑,可以基于新函数封装:

function isContainInvalidCharacter(str) {
    return !!findFirstInvalidCharacter(str);
}

内容的提问来源于stack exchange,提问作者newcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:37:05