2 ответов:
Чтобы удалить все символы, не являющиеся 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++; } }
Comments