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