我通过正则表达式错误地检查了"AA8187517"
字符串:
if (/^[a-z0-9]*$/i.test(value))
我突然在控制台中看到什么?
> value.split('').filter(function(el){ return el != '' })
< (11) ["", "A", "A", "8", "1", "8", "7", "5", "", "1", "7"]
数组中的这两个值是什么?
答案 0 :(得分:3)
数组中的两个“空”值包含字符8207(十进制),即200f(十六进制)。
U + 200F是Unicode中的从右到左标记,将显示一个(不可见的)标记,用于更改方向文本。
以下是您的问题的复制品以及删除字符的示例代码:
let value = "\u200FAA81875\u200F17";
console.log(value.split('').map(function (x) { return x.charCodeAt(0); }));
value = value.replace(/\u200F/g, '');
console.log(/^[a-z0-9]*$/i.test(value));
答案 1 :(得分:1)
四个想法。
1)在可行的情况下,我将使用显式正则表达式代替修饰符。警惕*
量词,因为它可能允许太多,包括没有值的 !!!
if (/^[A-Za-z0-9]*$/.test(value)) {
}
2)仔细检查Array.protoype.split()的定义,以及使用空字符串作为分隔符时会发生什么。
注意:如果将空字符串(“”)用作分隔符,则 字符串不会在每个用户可感知的字符(字素 群集)或每个unicode字符(代码点)之间,但在 每个UTF-16代码单元。这会破坏代理对。另请参见 你得到一个字符串到JavaScript中的字符数组?在stackoverflow上。
3) .trim()
在这里对您有用吗?
value.trim().split('').filter(function(el){ return el != '' })
4)考虑更改过滤谓词(回调方法)。
value.trim().split('').filter(function(element){ return /^[A-Za-z0-9]{1}$/.test(element) }
但是,请研究在空字符串上分割的重要性,并了解源字符串的编码。由于您正在过滤,因此您无需在过滤之前进行更换。单独过滤就足够了。您希望将想要的值列入白名单,因为通过替换将其列入黑名单肯定会给您带来麻烦。
Stackoverflow: How do you get a string to a character array in JavaScript?
答案 2 :(得分:-2)
不,您只应该将结果保存到新变量中
let array = ["text", "text2", '', 'text3'];
let a = array.filter((currentValue) => currentValue);
console.log(a); //["text", "text2", 'text3']