我想将两个连接字符:\ uD800 \ uDC00更改为x,但奇怪的是它会给出一个奇怪的字符,而不是有人会告诉我这里出了什么问题? 当我运行下面的代码:如何连接正则表达式中的范围?
System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x"));
我得到这个字符作为输出中
我想将两个连接字符:\ uD800 \ uDC00更改为x,但奇怪的是它会给出一个奇怪的字符,而不是有人会告诉我这里出了什么问题? 当我运行下面的代码:如何连接正则表达式中的范围?
System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x"));
我得到这个字符作为输出中
首先,在正则表达式中有语法错误。模式中的“& &”不应该在那里。同样,单引号和括号不应该在那里。
上面的语法更正是必需的,但并不足够。 \ 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"));
这串
([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])
不会出现在字符串
\uD800\uDC00
所以“x”不能取代任何东西。
所以我应该使用数组而不是? – Bionix1441 2015-03-13 17:49:43
那么replaceAll会尝试在您提供的字符串中找到该子字符串。如果需要替换,则需要提供具有相应子字符串的字符串。 replaceAll仅适用于String。这是一个用replaceAll的例子:[replaceAll](http://stackoverflow.com/questions/20556101/java-replace-all-in-a-string-with) – 2015-03-13 17:50:47
是的,但我想改变这些字符串联成一个x,所以我不必显示该squarre – Bionix1441 2015-03-13 17:53:27