我想将两个连接的字符更改为:\ uD800 \ uDC00变为x但奇怪的是它会给出一个奇怪的角色,有人可以告诉我这里有什么问题吗? 当我运行以下代码时:
System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x"));
我将此角色视为输出
答案 0 :(得分:2)
首先,正则表达式中存在语法错误。 "&&"在模式中不应该存在。同样,单引号和括号不应该在那里。
上面的语法更正是必需的,但还不够。 \ 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("\uD800\uDC00".replaceAll("[^\u0000-\uFFFF]", "x"));
答案 1 :(得分:1)
此子字符串
([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])
未出现在字符串
中\uD800\uDC00
所以" x"没有取代任何东西。