আমি জাভাতে কীভাবে মুদ্রণযোগ্য ইউনিকোড অক্ষরগুলি প্রতিস্থাপন করতে পারি?


89

নিম্নলিখিত ASCII নিয়ন্ত্রণ অক্ষর প্রতিস্থাপন করবে (এর জন্য শর্টহ্যান্ড [\x00-\x1F\x7F]):

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

নীচে বর্ণিত অক্ষরগুলি [\p{Graph}\x20]সহ সমস্ত ASCII অন-প্রিন্টযোগ্য অক্ষর (শর্টহ্যান্ড ) প্রতিস্থাপন করবে :

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

যাইহোক, উভয়ই ইউনিকোড স্ট্রিংয়ের জন্য কাজ করে না। ইউনিকোড স্ট্রিং থেকে প্রিন্টযোগ্য অক্ষরগুলি মুছে ফেলার জন্য কারও কি ভাল উপায় আছে?


4
শুধু একটি সংযোজন যেমন: এর ইউনিকোড সাধারণ ধরন তালিকা পাওয়া যাবে UAX # 44
McDowell


4
@ স্টাওয়ার্ট: হাই, আপনি কি শিরোনাম ছাড়াও প্রশ্ন / উত্তর দেখেছেন?!?
ডাগলিনিস

4
@ স্টিওয়ার্ট: অন্য প্রশ্নটি কেবল ছাপার যোগ্য অক্ষরের অ্যাসসিআই উপসেটটি কভার করে !!!
ড্যাগলিনিস

উত্তর:


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

ইউনিকোড রেজেক্স সম্পর্কে আরও দেখুন । java.util.regexPattern/ String.replaceAllতাদের সমর্থন করে।


জাভা ১.6 এ অন্তত তাদের পক্ষে কোনও সমর্থন নেই। ডাউনলোড .oracle.com/javase/6/docs/api/java/util/regex/… ... আমি আপনার লাইনটিও চেষ্টা করেছিলাম, এবং একটি ব্যাকস্ল্যাশ হারিয়ে যাওয়ার পাশাপাশি এটি কার্যকরভাবে কার্যকর হয় না।
ডাগলিনিগুলি

এটি কাজ করে: ইউনিকোড সমর্থন বিভাগে char c = 0xFFFA; String.valueOf(c).replaceAll("\\p{C}", "?");প্যাটার্ন লুকের জন্য জাভাদকটিতেও বলেছে যে এটি বিভাগগুলি সমর্থন করে
ওপ দে সির্কেল

তুমি ঠিক! আমি ক্ষমা প্রার্থনা করছি. আমি এটি লক্ষ্য করিনি কারণ জেডএল জেডপি বিভাগগুলি যুক্ত করতে হয়েছিল কারণ সেগুলি বেশিরভাগই সমস্যার উত্স ছিল। এটি পুরোপুরি কাজ করে। আপনি কি দয়া করে আপনার পোস্টে একটি মিনি সম্পাদনা করতে পারেন যাতে আমি এটি আবার ভোট দিতে পারি?
ডাগলিনিস

6
এছাড়াও অদৃশ্য শ্বেত স্পেস অক্ষর রয়েছে (0x0200B এর মতো), যা \ p {Zs} গোষ্ঠীর অংশ। দুর্ভাগ্যক্রমে, এটির মধ্যে সাধারণ সাদা স্থানও অন্তর্ভুক্ত রয়েছে। যারা কোনও ইনপুট স্ট্রিং ফিল্টার করতে চেষ্টা করছেন যা কোনও ফাঁকা জায়গা না থাকা উচিত, স্ট্রিংটি মনোমুগ্ধকর s.replaceAll("[\\p{C}\\p{Z}]", "")হবে
আন্দ্রে এল

4
এটিই আমি খুঁজছিলাম, আমি চেষ্টা করছিলাম replaceAll("[^\\u0000-\\uFFFF]", "")কিন্তু কোনও সাফল্য
পাই

58

ওপ ডি সির্কেল বেশিরভাগ ক্ষেত্রেই সঠিক। তাঁর পরামর্শ বেশিরভাগ ক্ষেত্রে কার্যকর হবে:

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

তবে যদি myStringবিএমপিবিহীন কোডপয়েন্ট থাকতে পারে তবে এটি আরও জটিল। \p{C}এর সারোগেট কোডপয়েন্ট রয়েছে \p{Cs}। উপরের প্রতিস্থাপনের পদ্ধতিটি কখনও কখনও সার্গেট জুটির অর্ধেকটি প্রতিস্থাপন করে নন-বিএমপি কোডপয়েন্টগুলিকে দূষিত করে দেয়। এটি ইচ্ছাকৃত আচরণের চেয়ে জাভা বাগ is

অন্যান্য উপাদান বিভাগগুলি ব্যবহার করা একটি বিকল্প:

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}যথাক্রমে।


ভাল, খুব খারাপ জাভা এক্সপ্রেশন সেগুলি নেই, তবে কমপক্ষে আমি এখনই তালিকাটি পেয়েছি ... কোনও কিছুর চেয়ে ভাল। ধন্যবাদ
ডাগলিনিস

5

আপনার লক্ষ্য জন্য ধাক্কা পদ্ধতি

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

ওপ ডি সির্কেল এবং নোকেজরের উত্তরের ভিত্তিতে , আমি সাধারণ স্ট্রিং পরিষ্কারের জন্য নিম্নলিখিতটি করি: 1. শীর্ষস্থানীয় বা অনুসরণকারী শ্বেতক্ষেত্রগুলি ট্রিমিং, ২ ডস 2 ইউনিক্স, ৩. ম্যাকপুনিক্স, ৪. হোয়াইটস্পেস ব্যতীত সমস্ত "অদৃশ্য ইউনিকোড অক্ষর" অপসারণ:

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

স্কালা REPL এর সাথে পরীক্ষিত।


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 );
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.