如何在正则表达式中连接范围



我想将两个连接字符:\uD800\uDC00更改为x,但奇怪的是它给出了一个奇怪的字符,有人可以告诉我这里有什么问题吗?当我运行以下代码时:

System.out.println("uD800uDC00".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 位范围之外的所有 Unicode 码位 \u0000 - \uFFFF。所以这可能是你想要的:

System.out.println("uD800uDC00".replaceAll("[^u0000-uFFFF]", "x"));

此子字符串

([uD800-uDBFF]&&['uDC00'-'uDFFF'])

不出现在字符串中

uD800uDC00

所以"X"不会取代任何东西。

最新更新