আপনি কীভাবে একটি স্ট্রিং থেকে নন-এএসসিআইআই অক্ষরগুলি কেটে ফেলতে পারেন? (সি # তে)


227

আপনি কীভাবে একটি স্ট্রিং থেকে নন-এএসসিআইআই অক্ষরগুলি কেটে ফেলতে পারেন? (সি # তে)


4
প্রতি sinelaw এর উত্তর নিচে , যদি আপনি যদি এর পরিবর্তে করতে চান প্রতিস্থাপন নন- ASCII অক্ষর, দেখতে এই উত্তরটি পরিবর্তে
ববসন

উত্তর:


414
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);

19
আমরা যারা RegEx চ্যালেঞ্জ জানাতে চাইছি, আপনি কি আপনার RegEx প্যাটার্ন সরল ইংরেজিতে লিখতে চান? অন্য কথায়, "দি this এটি করেন", ইত্যাদি ...
মেট্রো স্মুরফ

47
@ মেট্রো স্মুরফ the হ'ল অপারেটর। এটি মিলে যায় না এমন সমস্ত কিছুর পরিবর্তে, রেজেক্সকে মেলে না এমন সমস্ত কিছু অনুসন্ধান করতে বলে। Characters u #### - # u #### বলছে কোন বর্ণগুলি মিলে যায় \ সুতরাং আপনি প্রতিটি অ-এসকি চরিত্রের সাথে মিল রেখেছেন (না হওয়ার কারণে) এবং যা মেলে তার প্রতিস্থাপন করুন do
গর্ডন টকার 21

41
মুদ্রণযোগ্য অক্ষরগুলির ব্যাপ্তি 0020-007E, প্রিন্টযোগ্য অক্ষরগুলি প্রতিস্থাপনের জন্য নিয়মিত প্রকাশের জন্য অনুসন্ধান করা লোকদের জন্য
মুবাশার

1
@ গর্ডনটকার \ u0000- 00 u007F হল ইউটিএফ -8 বা ইউনিকোডের প্রথম 127 টি অক্ষরের সমতুল্য এবং প্রথম 225 নয় table টেবিলটি
ফুল_পাগো_ফুল

4
@ ফুল_প্রোগ_ফুল এই কারণেই আমি নিজেকে এক মিনিট পরে উত্তর দিয়েছিলাম যে এটি 127 এবং 255 নয় বলে নিজেকে সংশোধন করে :) :)
গর্ডন টাকার

125

এখানে একটি খাঁটি। নেট সমাধান যা নিয়মিত প্রকাশ প্রকাশ করে না:

string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
    Encoding.Convert(
        Encoding.UTF8,
        Encoding.GetEncoding(
            Encoding.ASCII.EncodingName,
            new EncoderReplacementFallback(string.Empty),
            new DecoderExceptionFallback()
            ),
        Encoding.UTF8.GetBytes(inputString)
    )
);

এটি অসুবিধাগুলি দেখাতে পারে তবে এটি স্বজ্ঞাত হওয়া উচিত। এটি স্ট্রিং রূপান্তর করতে .NET ASCII এনকোডিং ব্যবহার করে। রূপান্তরকালে UTF8 ব্যবহার করা হয় কারণ এটি যে কোনও মূল চরিত্রকে উপস্থাপন করতে পারে। এটি কোনও এনএসসিআইআই অক্ষরকে একটি খালি স্ট্রিংয়ে রূপান্তর করতে একটি এনকোর্ডার রিপ্লেসমেন্টফ্যালব্যাক ব্যবহার করে।


5
পারফেক্ট! আমি এটি আরটিএফ নথিতে সংরক্ষণের আগে একটি স্ট্রিং পরিষ্কার করার জন্য ব্যবহার করছি। খুব বেশি প্রশংশিত. রেগেক্স ভার্সনের চেয়ে বোঝা অনেক সহজ।
নাথান প্রীতি

21
আপনি কি বুঝতে সহজ বুঝতে চান? আমার কাছে, সমস্ত জিনিস যা সত্যই প্রাসঙ্গিক নয় (ফলব্যাকস, বাইটে রূপান্তর ইত্যাদি) আসলে কী ঘটে তা থেকে দৃষ্টি আকর্ষণ করছে।
bzlm

21
এটি স্ক্রু ড্রাইভারগুলি খুব বিভ্রান্তিকর বলে বলার মতো, তাই আমি পরিবর্তে কেবল একটি হাতুড়ি ব্যবহার করব।
ব্র্যান্ডন

8
@ ব্র্যান্ডন, আসলে এই কৌশলটি অন্যান্য কৌশলগুলির চেয়ে ভাল কাজ করে না। সুতরাং উপমাটি অভিনব আইসক্রিওড্রাইভার ডিলাক্স 2000 এর পরিবর্তে একটি সাধারণ প্লেইন স্ক্রু ড্রাইভার ব্যবহার করবে :) :)
বেলজল

10
একটি সুবিধা হ'ল আমি ASCII কে সহজেই আইএসও 8859-1 বা অন্য কোনও এনকোডিংয়ের সাথে প্রতিস্থাপন করতে পারি :)
আকিরা ইয়ামামোটো

38

আমি বিশ্বাস করি মনস ক্যামাসের অর্থ:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);

1
আইএমএইচও এই উত্তরটি স্বীকৃত উত্তরের চেয়ে ভাল কারণ এটি নিয়ন্ত্রণের অক্ষরগুলিকে বাদ দেয়।
Dean2690

15

আপনি যদি স্ট্রিপটি না চান, তবে লাতিন অ্যাকসেন্টেডকে অ- উচ্চারণযুক্ত অক্ষরে রূপান্তর করতে চান তবে এই প্রশ্নটি একবার দেখুন: আমি 8 বিট অক্ষরগুলিকে কীভাবে 7 বিট অক্ষরে অনুবাদ করব? (অর্থাত্ ইউ থেকে ইউ)


আমি এটি উপলব্ধি করতে পারি নি, তবে এটি আমার পক্ষে আরও ভাল সমাধান। অন্যান্য ব্যক্তির সন্ধান করা আরও সহজ করার জন্য আমি এই লিঙ্কটি প্রশ্নের একটি মন্তব্যে যুক্ত করতে যাচ্ছি। ধন্যবাদ!
ববসন

11

ফিলক্রুজের নিয়মিত অভিব্যক্তি সমাধান দ্বারা অনুপ্রাণিত হয়ে আমি একটি খাঁটি লিনকিউ সমাধান তৈরি করেছি

public static string PureAscii(this string source, char nil = ' ')
{
    var min = '\u0000';
    var max = '\u007F';
    return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}

public static string ToText(this IEnumerable<char> source)
{
    var buffer = new StringBuilder();
    foreach (var c in source)
        buffer.Append(c);
    return buffer.ToString();
}

এটি অনির্ধারিত কোড।


1
যারা এটি ধরেনি তাদের জন্য এটি একটি সি # 4.0 লিনকুই-ভিত্তিক সমাধান। :)

7
পৃথক টোেক্সট () পদ্ধতির পরিবর্তে, পিউরএসিআই () এর লাইন 3 প্রতিস্থাপন সম্পর্কে কীভাবে: নতুন স্ট্রিংটি ফেরান (উত্স.সিলিট (সি => সি <মিনিট? নীল: সি> সর্বোচ্চ? নীল: সি)। টোআর্রে ()) ;
এজেন্টেগা

অথবা সম্ভবত টু টেক্সট হিসাবে: রিটার্ন (নতুন স্ট্রিং (উত্স)) To টেক্সটেক্সটিকে এক্সটেনশন পদ্ধতি হিসাবে বলা ভাল - সাবলীল / পাইপলাইন স্টাইল। :-)
বেন্ট রাসমুসেন

এই কোডটি একটি স্থানের সাথে নন-এএসসিআইআই অক্ষরগুলি প্রতিস্থাপন করে। এগুলি return new string( source.Where( c => c >= min && c <= max ).ToArray() );
সরাতে,

@ ফুজিনেটর সেই কোডটি আপনাকে কোন অক্ষরটি অ-ASCII অক্ষরের সাথে প্রতিস্থাপন করবে তা নির্দিষ্ট করতে দেয়। ডিফল্টরূপে এটি একটি স্পেস ব্যবহার করে, তবে যদি এটির মতো বলা হয় ure PureASCII (Char.MinValue), এটি সমস্ত নন-এসএসআইআই'কে '\ 0' দিয়ে প্রতিস্থাপন করবে - যা এখনও তাদের ঠিক হ্রাস পাচ্ছে না, তবে একই রকম ফলাফল।
উলফিয়াস

5

রেজেক্সের দরকার নেই। শুধু এনকোডিং ব্যবহার করুন ...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));

5
এটা কাজ করে না. এটি ইউনিকোড চরিত্রগুলি ছাঁটাই করে না, এটি তাদের সাথে প্রতিস্থাপন করে? অক্ষর।
ডেভিড

1
@ ডেভিড ঠিক আছে। কমপক্ষে আমি পেয়েছিলাম ????nacho??যখন আমি চেষ্টা করেছি: たまねこnachoなちমনোতে 3.4
nacho4d

1
আপনি নিজের এনকোডিং ক্লাসটি ইনস্ট্যান্ট করতে পারেন যে অক্ষরগুলির পরিবর্তে এটি সেগুলি সরিয়ে দেয়। : GetEncoding পদ্ধতি দেখুন msdn.microsoft.com/en-us/library/89856k4b(v=vs.110).aspx
kkara

4

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

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);

আপনি যদি অন্য বিশেষ অক্ষর বা নির্দিষ্ট বিরামচিহ্ন এড়াতে চান তবে ascii টেবিলটি চেক করুন


1
যদি কেউ অন্য মন্তব্যগুলি লক্ষ্য না করে তবে মুদ্রণযোগ্য অক্ষরগুলি আসলে @ "" [^ 00 u0020- \ u007E] "। আপনি কৌতূহলী হলে টেবিলটি দেখার জন্য এখানে একটি লিঙ্ক দেওয়া হয়েছে: asciable.com
স্ক্রাদাম

3

আমি এখানে বর্ধিত আসকি চরিত্রগুলির জন্য একটি সমাধান খুঁজছিলাম, কিন্তু এটি সন্ধান করতে পারেনি। সবচেয়ে কাছের আমি খুঁজে পেয়েছি bzlm এর সমাধান । তবে এটি 127 অবধি কেবল এএসসিআইআই কোডের জন্য কাজ করে (স্পষ্টতই আপনি তার কোডে এনকোডিংয়ের ধরণটি প্রতিস্থাপন করতে পারেন তবে আমি মনে করি এটি বুঝতে কিছু জটিল ছিল Hence সুতরাং, এই সংস্করণটি ভাগ করে নেওয়া)। এখানে এমন একটি সমাধান রয়েছে যা বর্ধিত ASCII কোডগুলির জন্য কাজ করে অর্থাৎ 255 পর্যন্ত যা এটি is আইএসও 8859-1

এটি অ-এস্কি অক্ষরগুলি খুঁজে বের করে এবং সরিয়ে দেয় (255 এর বেশি)

Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"

Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", 
                                                New EncoderReplacementFallback(String.empty),
                                                New DecoderReplacementFallback())

Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)

Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)

console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:

কোডটির জন্য এখানে একটি কার্যকারী ফিডল

প্রয়োজন অনুসারে এনকোডিং প্রতিস্থাপন করুন, বিশ্রাম একই থাকবে।


2
এই স্ট্রিং "Ω সি ç ã" থেকে কেবলমাত্র Ω অপসারণ করতে কাজ করা একমাত্র। আপনাকে অনেক ধন্যবাদ!
রাফায়েল আরাজাতো

2

এটি সর্বোত্তম পারফরম্যান্স ভিত্তিক নয়, তবে বেশ সোজা-ফরোয়ার্ড লিনক পদ্ধতির:

string strippedString = new string(
    yourString.Where(c => c <= sbyte.MaxValue).ToArray()
    );

খারাপ দিকটি হ'ল সমস্ত "বেঁচে থাকা" অক্ষর প্রথমে টাইপের একটি অ্যারেতে স্থাপন করা হয় char[]যা stringনির্মাণকারী আর ব্যবহার না করার পরে ফেলে দেওয়া হয় ।


1

আমি এই রেজেক্স এক্সপ্রেশনটি ব্যবহার করেছি:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");

16
এটি বিরামচিহ্নগুলিও সরিয়ে দেয়, যদি কেউ এটি চাওয়া না হয়।
ড্র নোকস

1

আমি এই নিয়মিত এক্সপ্রেশনটি কোনও ফাইলের মধ্যে খারাপ চরিত্রগুলি ফিল্টার করতে ব্যবহার করি।

Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")

এটি ফাইলের নামের জন্য অনুমোদিত সমস্ত অক্ষর হওয়া উচিত।


1
নাঃ। পাথ.গেটইনুয়ালিডপথচারস এবং পাথ.গেটইনওয়েডফিল ফাইলনামচারগুলি দেখুন । সুতরাং, কয়েক হাজার বৈধ অক্ষর রয়েছে।
টম ব্লডজেট

আপনি ঠিক বলেছেন, টম। আমি আসলে সাধারণগুলির কথা ভাবছিলাম, কিন্তু আমি বন্ধুত্ব এবং কোঁকড়া ধনুর্বন্ধনী পাশাপাশি এই সমস্তগুলি রেখেছি - ^% $ # @! & + =।
ব্যবহারকারী 890332
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.