Op De Cirkel พูดถูกเป็นส่วนใหญ่ ข้อเสนอแนะของเขาจะใช้ได้ผลในกรณีส่วนใหญ่:
myString.replaceAll("\\p{C}", "?");
แต่ถ้าmyString
อาจมีจุดรหัสที่ไม่ใช่ BMP ก็ซับซ้อนกว่านี้ \p{C}
มี codepoints \p{Cs}
ตัวแทนของ วิธีการเปลี่ยนข้างต้นจะทำให้จุดรหัสที่ไม่ใช่ BMP เสียหายโดยบางครั้งแทนที่เพียงครึ่งหนึ่งของคู่ตัวแทน เป็นไปได้ว่านี่เป็นจุดบกพร่องของ Java แทนที่จะเป็นพฤติกรรมที่ตั้งใจไว้
การใช้หมวดหมู่องค์ประกอบอื่น ๆ เป็นตัวเลือก:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
อย่างไรก็ตามอักขระตัวแทนเดี่ยวที่ไม่ได้เป็นส่วนหนึ่งของคู่ (อักขระตัวแทนแต่ละตัวมีจุดรหัสที่กำหนด) จะไม่ถูกลบออก แนวทางที่ไม่ใช่ regex เป็นวิธีเดียวที่ฉันรู้ว่าจะจัดการได้อย่างเหมาะสม\p{C}
:
StringBuilder newString = new StringBuilder(myString.length());
for (int offset = 0; offset < myString.length();)
{
int codePoint = myString.codePointAt(offset);
offset += Character.charCount(codePoint);
switch (Character.getType(codePoint))
{
case Character.CONTROL:
case Character.FORMAT:
case Character.PRIVATE_USE:
case Character.SURROGATE:
case Character.UNASSIGNED:
newString.append('?');
break;
default:
newString.append(Character.toChars(codePoint));
break;
}
}