我想将两个串联的字符:\ 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"));

09-11 05:03