【发布时间】:2015-05-16 07:38:05
【问题描述】:
我想将两个连接的字符: \uD800\uDC00 更改为 x 但奇怪的是它给出了一个奇怪的字符,有人可以告诉我这里有什么问题吗? 当我运行以下代码时:
System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x"));
我得到这个字符作为输出
??????
【问题讨论】:
我想将两个连接的字符: \uD800\uDC00 更改为 x 但奇怪的是它给出了一个奇怪的字符,有人可以告诉我这里有什么问题吗? 当我运行以下代码时:
System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x"));
我得到这个字符作为输出
??????
【问题讨论】:
首先,正则表达式中存在语法错误。模式中的“&&”不应该在那里。同样,单引号和括号也不应该在那里。
上面的语法更正是必需的,但还不够。 \uD800 是一个“魔法”角色。它与下一个字符组合形成一个 4 字节的 Unicode 代码点:https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates
正则表达式是使用 Unicode 代码点解释的,而不是 Java 字符。 \uD800\uDC00 是单个 Unicode 代码点 (0x10000),因此正则表达式不匹配。我认为您可能想要排除 16 位范围 \u0000 - \uFFFF 之外的所有 Unicode 代码点。所以这可能就是你想要的:
System.out.println("\uD800\uDC00".replaceAll("[^\u0000-\uFFFF]", "x"));
【讨论】:
这个子串
([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])
没有出现在字符串中
\uD800\uDC00
所以“x”没有替换任何东西。
【讨论】: