2015-03-13 58 views
2

我想将两个连接字符:\ uD800 \ uDC00更改为x,但奇怪的是它会给出一个奇怪的字符,而不是有人会告诉我这里出了什么问题? 当我运行下面的代码:如何连接正则表达式中的范围?

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

我得到这个字符作为输出中

回答

2

首先,在正则表达式中有语法错误。模式中的“& &”不应该在那里。同样,单引号和括号不应该在那里。

上面的语法更正是必需的,但并不足够。 \ u800是一款“神奇”的角色。它与下一个字符结合形成单个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")); 
1

这串

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

不会出现在字符串

\uD800\uDC00 

所以“x”不能取代任何东西。

+0

所以我应该使用数组而不是? – Bionix1441 2015-03-13 17:49:43

+0

那么replaceAll会尝试在您提供的字符串中找到该子字符串。如果需要替换,则需要提供具有相应子字符串的字符串。 replaceAll仅适用于String。这是一个用replaceAll的例子:[replaceAll](http://stackoverflow.com/questions/20556101/java-replace-all-in-a-string-with) – 2015-03-13 17:50:47

+0

是的,但我想改变这些字符串联成一个x,所以我不必显示该squarre – Bionix1441 2015-03-13 17:53:27