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()