我试图调试在字符串中进行搜索的问题,它归结为以下有趣的代码段。
"item "
和"item "
似乎相等,但事实并非如此!
var result = ("item " === "item ");
document.write(result);
console.log(result);
在将其粘贴到Python解释器上进行了进一步研究之后,我发现第一个"item "
与"item\xc2\xa0"
的空间类型不同。我认为是non breaking space。
现在,匹配这些字符串的一种可能的解决方案是将\xc2\xa0
替换为空格,但是是否有更好的方法将所有特殊的空格字符转换为普通空格?
答案 0 :(得分:3)
第一个字符串中的空格是字符代码160(不间断空格),而第二个字符串中的空格是字符代码32(普通空格),因此这两个字符串彼此不相等。 / p>
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
将与a whole bunch of space-like characters相匹配:
[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]
,然后通过匹配和替换这些内容(如果需要,可使用换行符和制表符除外),将剩下普通的空格。
答案 1 :(得分:3)
在ES2015 / ES6中,您可以使用String.Prototype.normalize()方法将两个字符分解为相同的简单空格字符:
const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));
答案 2 :(得分:0)
trim
将删除字符串开头和结尾的所有空格。如果要在忽略开头和结尾空格的同时比较两个字符串,请对它们进行修剪。
"item ".trim() === "item ".trim()