我在浏览器和一些在线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个十六进制字符。或者无论如何都试着。
答案 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);