JS正则校验矩阵方程非法字符 末条测试用例失效如何修复
问题原因&解决方案
你遇到的问题由两个错误共同导致:
1. 正则带g全局修饰符导致匹配异常
带g修饰符的正则实例会内置lastIndex属性记录上次匹配的结束位置,每次调用test()/exec()都会从上次结束的位置继续匹配,循环调用时就会出现结果错乱的问题。regex101平台每次测试都是重新初始化正则实例,所以不会触发这个问题。
2. 测试用例的反斜杠没有转义
JS字符串里单个反斜杠是转义符,你写的"A\B"实际会被JS解析为"AB",反斜杠直接被吞掉了,自然检测不到非法字符。
修改方法
- 删掉正则里的
g修饰符,你只需要判断是否存在非法字符,不需要全局匹配 - 测试用例里的反斜杠要写成双反斜杠转义,即
"A\\B"
修改后的完整代码如下:
// 去掉g修饰符即可 let invalidCharRGX = /[^a-z0-9\.\+\-\*\^\(\)]/i; let strArr = [ "A+B-C", //1 预期返回false "(A+B)-C", //2 预期返回false "A^+B^-C", //3 预期返回false "A*B-C", //4 预期返回false "2.5A+C", // 5 预期返回false "A=B", //6 预期返回true "[A-B]", //7 预期返回true "A&B", //8 预期返回true "A\\B" //9 转义反斜杠,预期返回true ]; strArr.forEach((word, index) => { console.log(invalidCharRGX.test(word), word.match(invalidCharRGX), index + 1 ); })
运行后所有用例都会符合预期。
内容的提问来源于stack exchange,提问作者Pablo Luna
相关产品推荐
相关产品推荐

