此JavaScript代码段似乎不会在JavaScript中删除Unicode转义字符 - 为什么?

时间:2015-04-27 09:48:55

标签: javascript regex unicode

我在浏览器和一些在线JavaScript测试人员中测试了这个代码段:

var s = "testing \u0123 one two three";
s = s.replace(/\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]/g,'');
alert (s);

我希望警报中的结果只是“测试一两三”,但是\ u0123会出现一个有趣的角色。

我的问题是为什么没有更换条带?

我知道这不是最优雅的正则表达式。但这不正确吗?我正在剥离反推字符,然后是4个十六进制字符。或者无论如何都试着。

2 个答案:

答案 0 :(得分:4)

  

我的问题是为什么没有替换掉那个?

因为/\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]/g正则表达式字面上匹配\u字符串后跟4个十六进制字符。

尽管在字符串文字中指定的\u0123在解析步骤中被视为代码点,因此在运行时的字符串中没有\u0123但是有两个物理字节的UTF-16。

你真正想要的是[\u0080-\uFFFF]:

> "testing \u0123 one two three".replace(/[\u0080-\uFFFF]/g, '')
"testing  one two three"

此字符集指定不属于ASCII空间的所有代码点。

  

在字符串文字,正则表达式文字和标识符中,任何字符(代码单元)也可以表示为由六个字符组成的Unicode转义序列,即\ u加上四个十六进制数字。

参考文献:

答案 1 :(得分:0)

您的代码可以使用一些小的修改:

var s = "testing \\u0123 one two three"; // (1)
s = s.replace(/\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]/g,''); // (2)
alert (s);
  1. 逃离" \"在字符串中。
  2. 逃离" \"正则表达式中的字符。