मैं जावा में गैर-मुद्रण योग्य यूनिकोड वर्णों को कैसे बदल सकता हूं?


88

निम्नलिखित ASCII नियंत्रण वर्ण (के लिए आशुलिपि [\x00-\x1F\x7F]) की जगह लेगा :

my_string.replaceAll("\\p{Cntrl}", "?");

निम्नलिखित सभी ASCII गैर-मुद्रण योग्य वर्णों (शॉर्टहैंड के लिए [\p{Graph}\x20]) को प्रतिस्थापित करेंगे , जिसमें उच्चारण वर्ण भी शामिल हैं:

my_string.replaceAll("[^\\p{Print}]", "?");

हालांकि, न तो यूनिकोड स्ट्रिंग्स के लिए काम करता है। क्या किसी के पास यूनिकोड स्ट्रिंग से गैर-मुद्रण योग्य वर्णों को निकालने का एक अच्छा तरीका है?


2
सिर्फ एक परिशिष्ट के रूप में: यूनिकोड जनरल श्रेणियों की सूची UAX # 44
McDowell


1
@Stewart: नमस्ते, क्या आपने शीर्षक के अलावा प्रश्न / उत्तर को देखा है?
डेग्नेलिज़

1
@ स्टीवर्ट: कि अन्य प्रश्न गैर-मुद्रण योग्य वर्णों के केवल एससीआई सबसेट को कवर करता है !!!
dagnelies

जवाबों:


134
my_string.replaceAll("\\p{C}", "?");

यूनिकोड रेगेक्स के बारे में और देखें । java.util.regexPattern/ String.replaceAllउनका समर्थन करता है।


जावा 1.6 में कम से कम, उनके लिए कोई समर्थन नहीं है। download.oracle.com/javase/6/docs/api/java/util/regex/… ... मैंने आपकी लाइन को भी आज़माया, और एक बैकस्लैश को याद करने के अलावा, यह स्पष्ट रूप से बस काम नहीं करता है।
डेगनलीज

यह काम करता है: यूनिकोड सहायता अनुभाग char c = 0xFFFA; String.valueOf(c).replaceAll("\\p{C}", "?");में पैटर्न लुक के लिए जेवाडॉक में भी , यह श्रेणियों का समर्थन करता है
Op De Cirkel

तुम सही हो! मैं क्षमाप्रार्थी हूं। मैंने इस पर ध्यान नहीं दिया क्योंकि मुझे Zl Zp श्रेणियों को जोड़ना पड़ा क्योंकि वे ज्यादातर मुद्दों का स्रोत थे। यह पूरी तरह से काम करता है। क्या आप कृपया अपने पोस्ट को मिनी एडिट कर सकते हैं ताकि मैं इसे फिर से वोट कर सकूँ?
डेगनलीज

6
अदृश्य व्हॉट्सएप वर्ण (जैसे 0x0200B) भी हैं, जो \ p {Zs} समूह का हिस्सा हैं। दुर्भाग्य से, इसमें सामान्य व्हाट्सएप भी शामिल है। उन लोगों के लिए जो एक इनपुट स्ट्रिंग को फ़िल्टर करने की कोशिश कर रहे हैं, जिसमें कोई रिक्त स्थान नहीं होना चाहिए, स्ट्रिंग s.replaceAll("[\\p{C}\\p{Z}]", "")आकर्षण करेगा
एंड्री एल

1
यह वही है जो मैं ढूंढ रहा था, मैं कोशिश कर रहा था, replaceAll("[^\\u0000-\\uFFFF]", "")लेकिन कोई सफलता नहीं मिली
बिबासवन बंद्योपाध्याय 19

58

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);

    // Replace invisible control characters and unused code points
    switch (Character.getType(codePoint))
    {
        case Character.CONTROL:     // \p{Cc}
        case Character.FORMAT:      // \p{Cf}
        case Character.PRIVATE_USE: // \p{Co}
        case Character.SURROGATE:   // \p{Cs}
        case Character.UNASSIGNED:  // \p{Cn}
            newString.append('?');
            break;
        default:
            newString.append(Character.toChars(codePoint));
            break;
    }
}

8

आपको यूनिकोड श्रेणियों में "अन्य, नियंत्रण" और संभवतः "अन्य, प्रारूप" में रुचि हो सकती है (दुर्भाग्य से उत्तरार्द्ध में अप्राप्य और मुद्रण योग्य वर्ण शामिल हैं)।

जावा रेगुलर एक्सप्रेशंस में आप क्रमशः \p{Cc}और उनके लिए जाँच कर सकते \p{Cf}हैं।


खैर, बहुत बुरा जावा एक्सप्रेशन उनके पास नहीं हैं, लेकिन कम से कम मुझे अभी सूची मिली है ... कुछ भी नहीं से बेहतर। धन्यवाद
dagnelies

4

अपने लक्ष्य के लिए तरीके में झटका

public static String removeNonAscii(String str)
{
    return str.replaceAll("[^\\x00-\\x7F]", "");
}

public static String removeNonPrintable(String str) // All Control Char
{
    return str.replaceAll("[\\p{C}]", "");
}

public static String removeSomeControlChar(String str) // Some Control Char
{
    return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "");
}

public static String removeFullControlChar(String str)
{
    return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", "");
} 

0

मैंने इसके लिए इस सरल कार्य का उपयोग किया है:

private static Pattern pattern = Pattern.compile("[^ -~]");
private static String cleanTheText(String text) {
    Matcher matcher = pattern.matcher(text);
    if ( matcher.find() ) {
        text = text.replace(matcher.group(0), "");
    }
    return text;
}

आशा है कि यह उपयोगी है।


0

Op De Cirkel और noackjr के उत्तरों के आधार पर , मैं निम्नलिखित सामान्य स्ट्रिंग सफाई के लिए क्या कर रहा हूं: 1. ट्रिमिंग प्रमुख या अनुगामी व्हाट्सएप, 2. dos2unix, 3. mac2unix, 4. "अदृश्य यूनिकोड वर्ण" को हटाकर व्हाट्सएप को छोड़कर: "

myString.trim.replaceAll("\r\n", "\n").replaceAll("\r", "\n").replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}&&[^\\s]]", "")

स्काला आरईपीएल के साथ परीक्षण किया गया।


0

मैं यह प्रस्तावित करता हूं कि इसे बदलने के बजाय नीचे जैसे गैर मुद्रण योग्य वर्णों को हटा दें

private String removeNonBMPCharacters(final String input) {
    StringBuilder strBuilder = new StringBuilder();
    input.codePoints().forEach((i) -> {
        if (Character.isSupplementaryCodePoint(i)) {
            strBuilder.append("?");
        } else {
            strBuilder.append(Character.toChars(i));
        }
    });
    return strBuilder.toString();
}

-4

मैंने जावा में एक स्ट्रिंग से फोन नंबर +9 (987) 124124 एक्सट्रैक्ट अंकों के लिए कोड को फिर से डिजाइन किया है

 public static String stripNonDigitsV2( CharSequence input ) {
    if (input == null)
        return null;
    if ( input.length() == 0 )
        return "";

    char[] result = new char[input.length()];
    int cursor = 0;
    CharBuffer buffer = CharBuffer.wrap( input );
    int i=0;
    while ( i< buffer.length()  ) { //buffer.hasRemaining()
        char chr = buffer.get(i);
        if (chr=='u'){
            i=i+5;
            chr=buffer.get(i);
        }

        if ( chr > 39 && chr < 58 )
            result[cursor++] = chr;
        i=i+1;
    }

    return new String( result, 0, cursor );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.