4

我试图调试在字符串中搜索的问题,它归结为以下有趣的代码。

两者似乎都相等"item ""item "但事实并非如此!

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

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

通过将其粘贴到 Python 解释器上进一步调查后,我发现第一个"item "具有不同类型的空间,如"item\xc2\xa0". 我认为这是一个不间断的空间

现在,匹配这些字符串的一种可能解决方案是\xc2\xa0用空格替换,但是有没有更好的方法将所有特殊空格字符转换为普通空格?

4

3 回答 3

5

在 ES2015/ES6 中,您可以使用String.Prototype.normalize()方法将两个字符分解为相同的简单空格字符:

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

于 2020-01-09T08:06:03.370 回答
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]

并且通过匹配和替换它们(如果需要,换行符和制表符除外),您将留下普通空格。

于 2020-01-09T07:45:31.873 回答
0

trim将删除字符串开头和结尾的所有空格。如果您想比较两个字符串而忽略前导和尾随空格,请修剪它们。

"item ".trim() === "item ".trim()
于 2020-01-09T07:49:59.720 回答