错误消息不是关于controlInput,而是关于controlInput.match()返回的值。
如果controlInput 的值与正则表达式匹配,则为Array;如果不匹配,则为null。
常见的解决方案是将controlInput.match()返回的值提取到一个变量中,然后仅当它不是null时才使用它。
if (controlInput !== null) {
const matches = controlInput.match(/[$;.,'"-=!@#$%^&*()]/g);
if (matches && matches.length) {
return 'some message';
}
}
但是如果您不关心匹配的子字符串,而仅当字符串与正则表达式匹配时,您可以直接检查controInput.match()返回的值:
if (controlInput !== null && controlInput.match(/[$;.,'"-=!@#$%^&*()]/g)) {
return 'some message';
}
或者,更好的是,使用RegExp.test()。它更快。
if (controlInput !== null && /[$;.,'"-=!@#$%^&*()]/.test(controlInput)) {
return 'some message';
}
关于正则表达式的一些想法
显然您想检查controlInput 的值是否包含一些特殊字符。
在regexp 中,表达式[...] 称为"character set",它匹配方括号之间指定的字符列表中的一个字符。
大多数字符在字符集中表示自己。但是,字符集中有两个特殊字符。其中一个是^,但前提是它是字符集中的第一个字符(紧跟在[ 之后)。它否定了字符集的含义。
另一个特殊字符是-,当它不是字符集中的第一个或最后一个字符时。 [a-z] 不是指“a、- 或 z 之一”,而是“介于 a 和 z 之间的任何字符”,即任何小写字母。
正则表达式中的字符类包含片段"-=,该片段在字符集中匹配" 和ASCII code 中的" 和= 之间的所有字符。此子集包括.、,、; 和您已包含在字符集中的其他字符。
这就是为什么我认为您的意图不是包括 " 和 = 之间的所有字符,而只包括字符 "、- 和 =。
为了获得预期的行为(- 代表自己)在集合的开头或结尾移动-。
if (controlInput !== null && /[-$;.,'"=!@#$%^&*()]/.test(controlInput)) {
return 'some message';
}