如何获取正则表达式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
相关产品推荐
相关产品推荐

