JavaScript:用普通空格替换不间断空格和特殊空格字符

Irs*_*P I 8 javascript string ascii non-breaking-characters

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

\n\n

两者"item ""item "看起来相等,但事实并非如此!

\n\n

\r\n
\r\n
var result = ("item\xc2\xa0" === "item ");\r\n\r\ndocument.write(result);\r\nconsole.log(result);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

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

\n\n

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

\n

Kai*_*ido 9

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

const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));
Run Code Online (Sandbox Code Playgroud)


Cer*_*nce 5

第一个字符串中的空格是字符代码 160(不间断空格),第二个字符串中的空格是字符代码 32(普通空格),因此两个字符串彼此不相等。

\n\n

\r\n
\r\n
console.log("item\xc2\xa0".charCodeAt(4), "item ".charCodeAt(4));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

\n

有没有更好的方法将所有特殊空格字符转换为普通空格?

\n
\n\n

您可以匹配不是制表符或换行符的空格字符并替换为普通空格:

\n\n

\r\n
\r\n
const makeSpacesNormal = str => str.replace(/(?=\\s)[^\\r\\n\\t]/g, \' \');\r\nconsole.log(makeSpacesNormal("item\xc2\xa0") === makeSpacesNormal("item "));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

具体来说,\\s将匹配一大堆类似空格的字符

\n\n
[\\t\\n\\v\\f\\r \\u00a0\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u200b\\u2028\\u2029\\u3000]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

  • 您可以在[此处](https://tc39.es/ecma262/#sec-line-terminators)中看到官方规范中的描述(向上滚动一点,也可以向下滚动 - 查看“WhiteSpace”和“Line”终结者表)。我认为 Regex101 试图简化所有语言的事情,而不是详细介绍每种语言的机制,不确定它对于其他语言有多精确 (2认同)