Пустое значение на самом деле не пустое? - PullRequest
0 голосов
/ 21 апреля 2019

Я получаю ложную проверку "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"]

console

Что это за два значения в массиве?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2019

Два «пустых» значения в вашем массиве содержат символ 8207 (десятичный), который равен 200f (шестнадцатеричный).

U + 200F - это маркер ПРАВО НА ЛЕВЫЙ в Юникоде, (невидимый) маркер, который изменяет направление текста.

Вот репродукция вашей проблемы плюс пример кода для удаления символа:

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 голос
/ 21 апреля 2019

Четыре мысли.

1) Я бы использовал явные регулярные выражения, где это целесообразно, вместо модификаторов. Будьте осторожны с квантификатором *, так как он может допустить слишком много, , включая отсутствие значения !!!

if (/^[A-Za-z0-9]*$/.test(value)) {

}

2) Внимательно изучите определение Array.protoype.split () и что произойдет, когда вы используете пустую строку в качестве разделителя.

Внимание: если в качестве разделителя используется пустая строка (""), строка не разделяется между каждым воспринимаемым пользователем символом (графема кластера) или между каждым символом Unicode (кодовой точкой), но между каждый кодовый блок UTF-16. Это уничтожает суррогатные пары. Смотрите также Как сделать вы получаете строку в массив символов в JavaScript? в стеке потока.

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: как получить строку в массив символов в JavaScript?

0 голосов
/ 21 апреля 2019

Нет, вы просто должны сохранить результат в новой переменной:

let array = ["text", "text2", '', 'text3'];

let a = array.filter((currentValue) => currentValue);
console.log(a); //["text", "text2", 'text3']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...