15
如何在java中從unicode基本多語言平面之外匹配字符(打算移除它們)?Java正則表達式匹配基本多語言平面以外的字符
如何在java中從unicode基本多語言平面之外匹配字符(打算移除它們)?Java正則表達式匹配基本多語言平面以外的字符
要刪除所有非BMP字符,下面應該工作:
String sanitizedString = inputString.replaceAll("[^\u0000-\uFFFF]", "");
您是否正在尋找特定字符或BMP以外的所有字符?
如果是前者,你可以使用一個StringBuilder
構建從更高層面包含代碼點的字符串,正則表達式將會按預期:
String test = new StringBuilder().append("test").appendCodePoint(0x10300).append("test").toString();
Pattern regex = Pattern.compile(new StringBuilder().appendCodePoint(0x10300).toString());
Matcher matcher = regex.matcher(test);
matcher.find();
System.out.println(matcher.start());
如果你正在尋找去除所有非從字符串中的字符-BMP,然後我會使用StringBuilder
,而不是直接的正則表達式:
StringBuilder sb = new StringBuilder(test.length());
for (int ii = 0 ; ii < test.length() ;)
{
int codePoint = test.codePointAt(ii);
if (codePoint > 0xFFFF)
{
ii += Character.charCount(codePoint);
}
else
{
sb.appendCodePoint(codePoint);
ii++;
}
}
你真的測試過了嗎?因爲您的字符範圍包括用於構建非BMP代碼點的替代範圍。 – Anon 2010-10-27 17:32:12
@Anon:正如你在你自己的答案中指出的那樣,正則表達式是在碼點級而不是碼單元級進行評估的,所以它看不到代理。 – axtavt 2010-10-27 17:35:04
是的,這已經用非BMP字符進行了測試。 – 2010-10-27 17:39:35