JavaScript:用普通 space 替换不间断 space 和特殊 space 字符
JavaScript: replace non breaking space and special space characters with ordinary space
我试图调试一个在字符串中搜索的问题,结果归结为以下有趣的代码段。
"item "
和 "item "
看起来是一样的,其实不然!
var result = ("item " === "item ");
document.write(result);
console.log(result);
通过将其粘贴到 Python 解释器进一步调查后,我发现第一个 "item "
与 "item\xc2\xa0"
有不同类型的 space。我认为是 non breaking space.
现在,匹配这些字符串的可能解决方案是将 \xc2\xa0
替换为 space,但是是否有更好的方法将所有特殊 space 字符转换为普通 space?。
第一个字符串中的space是字符代码160(一个不间断的space),第二个字符串中的space是字符代码32(一个普通的space), 因此字符串彼此不相等。
console.log("item ".charCodeAt(4), "item ".charCodeAt(4));
is there a better approach to convert all special space characters with normal space?.
您可以匹配 space 个不是制表符或换行符的字符,并替换为正常的 space:
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]
并通过匹配和替换它们(换行符和制表符除外,如果需要),您将得到普通的 spaces。
trim
将删除字符串开头和结尾的所有空格。如果您想在忽略前导和尾随空格的情况下比较两个字符串,trim 两个。
"item ".trim() === "item ".trim()
在ES2015/ES6中你可以使用String.Prototype.normalize()方法将两个字符分解为同一个简单的space字符:
const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));
我试图调试一个在字符串中搜索的问题,结果归结为以下有趣的代码段。
"item "
和 "item "
看起来是一样的,其实不然!
var result = ("item " === "item ");
document.write(result);
console.log(result);
通过将其粘贴到 Python 解释器进一步调查后,我发现第一个 "item "
与 "item\xc2\xa0"
有不同类型的 space。我认为是 non breaking space.
现在,匹配这些字符串的可能解决方案是将 \xc2\xa0
替换为 space,但是是否有更好的方法将所有特殊 space 字符转换为普通 space?。
第一个字符串中的space是字符代码160(一个不间断的space),第二个字符串中的space是字符代码32(一个普通的space), 因此字符串彼此不相等。
console.log("item ".charCodeAt(4), "item ".charCodeAt(4));
is there a better approach to convert all special space characters with normal space?.
您可以匹配 space 个不是制表符或换行符的字符,并替换为正常的 space:
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]
并通过匹配和替换它们(换行符和制表符除外,如果需要),您将得到普通的 spaces。
trim
将删除字符串开头和结尾的所有空格。如果您想在忽略前导和尾随空格的情况下比较两个字符串,trim 两个。
"item ".trim() === "item ".trim()
在ES2015/ES6中你可以使用String.Prototype.normalize()方法将两个字符分解为同一个简单的space字符:
const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));