JavaScript: заменить неразрывные пробелы и специальные пробелы на обычные пробелы - PullRequest
3 голосов
/ 09 января 2020

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 января 2020

Пробел в первой строке - это код символа 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]

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

2 голосов
/ 09 января 2020

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

const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));
0 голосов
/ 09 января 2020

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

"item ".trim() === "item ".trim()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...