JavaScript: замените неразрывные пробелы и специальные пробелы обычными пробелами

Я пытался отладить проблему поиска внутри строки, и это привело к следующему интересному фрагменту кода.

И то и другое "item " а также "item " кажутся равными, но это не так!

var result = ("item " === "item ");

document.write(result);
console.log(result);

После дальнейшего изучения этого вопроса, вставив его в интерпретатор Python, я обнаружил, что первый "item " имеет другое пространство, чем "item\xc2\xa0". Я считаю, что это неразрывное пространство.

Теперь возможное решение для сопоставления этих строк будет заключаться в замене \xc2\xa0 с пробелом, но есть ли лучший подход для преобразования всех специальных пробелов в нормальный пробел?.

3 ответа

Решение

Пробел в первой строке - это код символа 160 (неразрывный пробел), а пробел во второй строке - это код символа 32 (нормальный пробел), поэтому строки не равны друг другу.

console.log("item ".charCodeAt(4), "item ".charCodeAt(4));

есть ли лучший подход для преобразования всех специальных пробелов в обычные пробелы?.

Вы можете сопоставить символы пробела, которые не являются вкладками или символами новой строки, и заменить их обычным пробелом:

const makeSpacesNormal = str => str.replace(/(?=\s)[^\r\n\t]/g, ' ');
console.log(makeSpacesNormal("item ") === makeSpacesNormal("item "));

В частности, \sбудет соответствовать целому ряду символов, похожих на пробелы:

[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]

и, сопоставив и заменив их (кроме символов новой строки и табуляции, если хотите), у вас останутся обычные пробелы.

В ES2015/ES6 вы можете использовать метод String.Prototype.normalize() для разложения обоих символов на один и тот же простой символ пробела:

const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));

trim удалит все пробелы в начале и в конце строки. Если вы хотите сравнить две строки, игнорируя начальные и конечные пробелы, обрежьте их обе.

"item ".trim() === "item ".trim()
Другие вопросы по тегам