आप एक स्ट्रिंग से गैर-एएससीआईआई पात्रों को कैसे पट्टी कर सकते हैं? (सी # में)


227

आप एक स्ट्रिंग से गैर-एएससीआईआई पात्रों को कैसे पट्टी कर सकते हैं? (सी # में)


4
प्रति sinelaw का जवाब नीचे , अगर आप के बजाय करना चाहते हैं की जगह गैर- ASCII वर्ण, देखने के इस जवाब के बजाय
बोबसन

जवाबों:


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

19
हम में से उन लोगों के लिए, जिन्हें आपने रेग्युलर इंग्लिश में अपना RegEx पैटर्न लिखना पसंद किया है, RegEx'd को चुनौती दी थी। दूसरे शब्दों में, "^ यह करता है", आदि ...
मेट्रो स्मर्फ

47
@Metro Smurf ^ ऑपरेटर नहीं है। यह रेगेक्स को सब कुछ खोजने के लिए कहता है जो मैच नहीं करता है, इसके बजाय जो मैच करता है। \ U #### - \ u #### का कहना है कि कौन से वर्ण मेल खाते हैं। \ u0000- \ u007F utf-8 या यूनिकोड में पहले 255 वर्णों के बराबर है, जो हमेशा एससीआई अक्षर होते हैं। इसलिए आप हर गैर एससीआई चरित्र (नहीं के कारण) से मेल खाते हैं और जो कुछ मेल खाता है उस पर एक प्रतिस्थापन करें।
गॉर्डन टकर

41
मुद्रण योग्य वर्णों की सीमा 0020-007E है, गैर-मुद्रण योग्य वर्णों को बदलने के लिए नियमित अभिव्यक्ति की तलाश कर रहे लोगों के लिए
मुबाशर

1
@GordonTucker \ u0000- \ u007F utf-8 या यूनिकोड में पहले 127 वर्णों के समतुल्य है और पहले 225 नहीं है। तालिका
full_prog_full

4
@full_prog_full यही कारण है कि मैंने एक मिनट के बारे में खुद को जवाब दिया बाद में खुद को यह कहने के लिए कि यह 127 था और 255 नहीं था। :)
गॉर्डन टकर

125

यहाँ एक शुद्ध .NET समाधान है जो नियमित अभिव्यक्ति का उपयोग नहीं करता है:

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 का उपयोग रूपांतरण के दौरान किया जाता है क्योंकि यह किसी भी मूल वर्ण का प्रतिनिधित्व कर सकता है। यह किसी भी गैर- ASCII वर्ण को रिक्त स्ट्रिंग में परिवर्तित करने के लिए एक एनकोडररप्लेमेंटफ़ॉलबैक का उपयोग करता है।


5
उत्तम! मैं इसे एक आरटीएफ दस्तावेज़ में सहेजने से पहले एक स्ट्रिंग को साफ करने के लिए उपयोग कर रहा हूं। बहुत ज्यादा अधिमूल्यित। रेगेक्स संस्करण की तुलना में समझने में बहुत आसान है।
नाथन प्रात:

21
आपको वास्तव में समझना आसान है? मेरे लिए, वे सभी चीजें जो वास्तव में प्रासंगिक नहीं हैं (फालबैक, बाइट्स के लिए रूपांतरण आदि) जो वास्तव में होता है उससे ध्यान आकर्षित कर रहा है।
bzlm

21
यह कहने की तरह है कि स्क्रू ड्रायर्स बहुत भ्रामक हैं इसलिए मैं इसके बजाय सिर्फ एक हथौड़ा का उपयोग करूंगा।
ब्रैंडन

8
@ ब्रेंडन, वास्तव में, यह तकनीक अन्य तकनीकों की तुलना में बेहतर काम नहीं करती है। तो सादृश्य एक फैंसी iScrewDriver डिलक्स 2000 के बजाय एक सादे पुराने पेचकश का उपयोग किया जाएगा। :)
bzlm

10
एक फायदा यह है कि मैं आसानी से ASCII को ISO 8859-1 या किसी अन्य एन्कोडिंग के साथ बदल सकता हूं :)
अकीरा यामामोटो

38

मेरा मानना ​​है कि मॉन्सकैमुस का मतलब था:

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

1
IMHO यह उत्तर स्वीकृत उत्तर से बेहतर है क्योंकि यह नियंत्रण वर्णों को अलग करता है।
डीन

15

यदि आप पट्टी नहीं करना चाहते हैं, लेकिन वास्तव में लैटिन उच्चारण को गैर-उच्चारण पात्रों में परिवर्तित करते हैं, तो इस प्रश्न पर एक नज़र डालें: मैं 8 बिट वर्णों को 7 बिट वर्णों में कैसे अनुवाद करूं? (यानी (से यू)


मुझे यह एहसास भी नहीं था कि यह संभव है, लेकिन यह मेरे लिए एक बेहतर समाधान है। मैं इस लिंक को टिप्पणी पर जोड़ने जा रहा हूं, ताकि यह सवाल दूसरे लोगों को आसानी से मिल सके। धन्यवाद!
बोबसन

11

फिल्क्रूज़ के रेगुलर एक्सप्रेशन सॉल्यूशन से प्रेरित होकर , मैंने एक शुद्ध LINQ सॉल्यूशन बनाया है

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
जिन लोगों ने इसे नहीं पकड़ा, उनके लिए यह C # 4.0 LINQ- आधारित समाधान है। :)

7
अलग-अलग ToText () पद्धति के बजाय, PureAcii () के साथ लाइन 3 को बदलने के बारे में: नया स्ट्रिंग (source.Select (c => c <min? Nil: c> max? Nil: c) .TarArray ()) वापस कैसे करें। ;
Agentnega 5

या शायद ToText के रूप में: वापसी (नया स्ट्रिंग (स्रोत))। ToArray () - जो सबसे अच्छा प्रदर्शन करता है, उसके आधार पर। ToText को विस्तार विधि - धाराप्रवाह / पाइपलाइन शैली के रूप में रखना अभी भी अच्छा है। :-)
बेंट रासमुसेन

यह कोड गैर-ASCII वर्णों को एक स्थान से बदल देता है। उन्हें return new string( source.Where( c => c >= min && c <= max ).ToArray() );
उतारने के

@Foozinator यह कोड आपको यह निर्दिष्ट करने की अनुमति देता है कि किस चरित्र को गैर-ASCII वर्णों से बदलना है। डिफ़ॉल्ट रूप से यह एक स्थान का उपयोग करता है, लेकिन अगर इसे .PASASCII (Char.MinValue) कहा जाता है, तो यह सभी गैर-ASCII को '\ 0' के साथ बदल देगा - जो अभी भी उन्हें बिल्कुल अलग नहीं कर रहा है, लेकिन समान परिणाम।
उल्फियस

5

रेगेक्स की कोई आवश्यकता नहीं है। बस एन्कोडिंग का उपयोग करें ...

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

5
यह काम नहीं करता। यह यूनिकोड वर्णों को नहीं छीनता है, यह उनके साथ बदल देता है? चरित्र।
डेविड

1
@ डेविड सही है। कम से कम मुझे ????nacho??तब मिला जब मैंने कोशिश की: たまねこnachoなちमोनो 3.4 में
nacho4d

1
आप अपने स्वयं के एन्कोडिंग वर्ग को तुरंत बदल सकते हैं जो पात्रों को बदलने के बजाय उन्हें हटा देता है। GetEncoding
kkara

4

मैंने पाया कि डेटाबेस से बाहर टिप्पणी ब्लॉक को पार्स करने के लिए निम्न थोड़ा परिवर्तित रेंज उपयोगी है, इसका मतलब है कि आपको टैब से बचने और पात्रों से बचने की ज़रूरत नहीं होगी जिससे सीएसवी क्षेत्र परेशान हो जाएगा।

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

यदि आप अन्य विशेष वर्णों से बचना चाहते हैं या विशेष विराम चिह्न की जाँच करते हैं


1
यदि किसी ने अन्य टिप्पणियों पर ध्यान नहीं दिया है, तो प्रिंट करने योग्य वर्ण वास्तव में @ "[^ \ u0020- \ u007E]" हैं। यदि आप जिज्ञासु हैं तो तालिका देखने के लिए यहां एक लिंक दिया गया है: asciitable.com
15

3

मैं यहां आस्की पात्रों के लिए एक समाधान की तलाश में आया था, लेकिन इसे पा नहीं सका। मैंने जो सबसे नज़दीकी पाया वह है bzlm का समाधान । लेकिन वह केवल 127 तक ASCII कोड के लिए काम करता है (जाहिर है कि आप एन्कोडिंग प्रकार को उसके कोड में बदल सकते हैं, लेकिन मुझे लगता है कि यह समझना थोड़ा जटिल था। इसलिए, इस संस्करण को साझा करना)। यहां एक समाधान है जो विस्तारित ASCII कोड के लिए काम करता है अर्थात 255 तक जो कि आईएसओ 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
केवल एक जिसने इस स्ट्रिंग "ç c ç ã" से केवल one को हटाने के लिए काम किया। आपका बहुत बहुत धन्यवाद!
राफेल आराजो

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
नहीं। Path.GetInvalidPathChars और Path.GetInvalidFileNameChars देखें । तो, हजारों वैध वर्ण हैं।
टॉम ब्लोडेट

आप सही हैं, टॉम। मैं वास्तव में आम लोगों के बारे में सोच रहा था, लेकिन मैंने कोष्ठक और घुंघराले ब्रेसिज़ के साथ-साथ इन सभी को भी छोड़ दिया - ^ $ $ # @! & + =।
user890332
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.