Op De Cirkel ज्यादातर सही है। उनका सुझाव ज्यादातर मामलों में काम करेगा:
myString.replaceAll("\\p{C}", "?");
लेकिन अगर myStringगैर-बीएमपी कोडपॉइंट हो सकते हैं तो यह अधिक जटिल है। \p{C}के सरोगेट कोडपॉइंट्स शामिल हैं \p{Cs}। ऊपर दी गई प्रतिस्थापन विधि कभी-कभी सरोगेट जोड़ी के केवल आधे हिस्से की जगह गैर-बीएमपी कोडपॉइंट को भ्रष्ट कर देगी। यह संभव है कि यह इरादा व्यवहार के बजाय जावा बग हो।
अन्य घटक श्रेणियों का उपयोग करना एक विकल्प है:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
हालांकि, एकान्त सरोगेट वर्ण एक जोड़ी का हिस्सा नहीं है (प्रत्येक सरोगेट चरित्र में एक निर्धारित कोडपॉइंट है) को हटाया नहीं जाएगा। एक गैर-रेगेक्स दृष्टिकोण एकमात्र तरीका है जिसे मैं ठीक से संभालना जानता हूं \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;
}
}