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

时间:2015-03-13 17:45:56

标签: java regex

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

System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x"));

我将此角色视为输出

2 个答案:

答案 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"没有取代任何东西。