मैं डैश को छोड़कर स्ट्रिंग से सभी गैर अल्फ़ान्यूमेरिक वर्ण कैसे निकालूं?


606

मैं डैश और अंतरिक्ष वर्णों को छोड़कर एक स्ट्रिंग से सभी गैर अल्फ़ान्यूमेरिक वर्ण कैसे निकालूं?

जवाबों:


868

[^a-zA-Z0-9 -]एक खाली स्ट्रिंग के साथ बदलें ।

Regex rgx = new Regex("[^a-zA-Z0-9 -]");
str = rgx.Replace(str, "");

79
-एक वर्ग के लिए इस्तेमाल होने से रोकने के लिए वर्थ उल्लेख, जो चरित्र वर्ग के अंत में होना चाहिए, या बैकस्लैश के साथ बच गया।
पीटर बॉटन

6
@ अपने regex में वैश्विक ध्वज सेट कर सकते हैं - इसके बिना, यह सिर्फ पहले मैच की जगह लेता है। एक त्वरित Google आपको यह बताना चाहिए कि क्लासिक एएसपी रेगेक्स में वैश्विक ध्वज कैसे सेट किया जाए। अन्यथा, के replaceAllबजाय एक समारोह के लिए देखो replace
अमरघोष

20
यहाँ एक रेगेक्स संकलित संस्करण है: return Regex.Replace(str, "[^a-zA-Z0-9_.]+", "", RegexOptions.Compiled); एक ही मूल प्रश्न
पैगे वाटसन

13
@MGOwen क्योंकि हर बार जब आप उपयोग करते हैं तो स्ट्रिंग के अपरिवर्तनीय होने के कारण आप एक नई वस्तु बना रहे हैं। जब आप स्ट्रिंग का उपयोग करते हैं। खाली आप एक रिक्त स्ट्रिंग का प्रतिनिधित्व करने के लिए आवश्यक एकल उदाहरण का पुन: उपयोग कर रहे हैं जो कि अधिक तेज़ होने के साथ-साथ अधिक कुशल भी है।
ब्रायन स्कॉट

17
@BrianScott मुझे पता है कि यह पुराना है, लेकिन एक खोज में पाया गया था इसलिए मुझे लगता है कि यह प्रासंगिक है। यह वास्तव में आपके द्वारा चलाए जा रहे .NET के संस्करण पर निर्भर करता है। > 2.0 का उपयोग करता है ""और string.Emptyबिल्कुल वैसा ही। stackoverflow.com/questions/151472/…
जेरेड

348

मैं RegEx का उपयोग कर सकता था, वे सुरुचिपूर्ण समाधान प्रदान कर सकते हैं लेकिन वे प्रदर्शन संबंधी मुद्दों का कारण बन सकते हैं। यहाँ एक उपाय है

char[] arr = str.ToCharArray();

arr = Array.FindAll<char>(arr, (c => (char.IsLetterOrDigit(c) 
                                  || char.IsWhiteSpace(c) 
                                  || c == '-')));
str = new string(arr);

कॉम्पैक्ट फ्रेमवर्क का उपयोग करते समय (जिसमें FindAll नहीं है)

FindAll को 1 से बदलें

char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || 
                             char.IsWhiteSpace(c) || 
                             c == '-')).ToArray(); 

str = new string(arr);

1 टिप्पणी ShawnFeatherly द्वारा


41
मेरे परीक्षण में, यह तकनीक बहुत तेज थी। सटीक होने के लिए, यह रेगेक्स रिप्लेसमेंट तकनीक से सिर्फ 3 गुना तेज था।
Dan

12
कॉम्पैक्ट ढांचे में FindAll नहीं है, आप FindAll को बदल सकते हैंchar[] arr = str.Where(c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-')).ToArray();
ShawnFeatherly

2
क्या किसी ने इसका परीक्षण किया है? यह बिल्कुल काम नहीं किया। -लेकिन यह मेरे लिए किया: स्ट्रिंग str2 = नया स्ट्रिंग (str.Where (c =>) (char.IsLetterOrDigit (c)))। ToArray ());
केविनडेउस

48

तुम कोशिश कर सकते हो:

string s1 = Regex.Replace(s, "[^A-Za-z0-9 -]", "");

sतुम्हारा तार कहाँ है


1
ओपी ने डैश के लिए नहीं अंडरस्कोर पूछा
सीन बी

39

System.Linq का उपयोग करना

string withOutSpecialCharacters = new string(stringWithSpecialCharacters.Where(c =>char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray());

@ मिचेल यह समान है लेकिन कम से कम यह एक लाइनर है, बजाय 3 लाइनों के। मैं कहूंगा कि यह एक अलग जवाब देने के लिए पर्याप्त है।
दमास

1
@ डायमास अब मैं मानता हूं कि यह स्वीकार्य है, लेकिन इसलिए नहीं कि व्हॉट्सएप अलग है। जाहिरा तौर पर यह हिस्सा जो कार्यात्मक रूप से समतुल्य है (केवल var नाम भिन्न है) इस उत्तर के लिखे जाने के बाद संपादित किया गया था।
माइकल - जहां क्ले Shirky

1
@ZainAli, यदि आप एक तुच्छ संपादन करते हैं और मुझे पिंग करते हैं, तो मैं अपने डाउनवोट को उलट दूंगा। मैं विपत्ति के किसी भी आग्रह के लिए माफी माँगता हूँ।
माइकल - कहाँ है क्ले शिर्क

22

रेगेक्स है [^\w\s\-]*:

\sस्थान के बजाय उपयोग करना बेहतर है ( ), क्योंकि पाठ में एक टैब हो सकता है।


1
जब तक आप टैब नहीं निकालना चाहते।
मैट एलेन

... और newlines, और अन्य सभी पात्रों को "व्हाट्सएप" माना जाता है।
पीटर बॉटन

6
यह समाधान उपरोक्त समाधानों से कहीं बेहतर है क्योंकि यह अंतर्राष्ट्रीय (गैर-अंग्रेजी) वर्णों का भी समर्थन करता है। <! - भाषा: c # -> string s = "Mötley Crue&の: の 氏 c और कांजी 名 और हीरागाना い;"; string r = Regex.Replace (s, "[^ \\ w \\ s -] *", ""); उपरोक्त उत्पादन के साथ r: Mötley Crue&の
人::

1
स्ट्रिंग में @ से बचने के लिए @ का उपयोग करें: @ "[^ \ w \ s -] *"
जकूब पावलिंस्की

1
यह, उह ... अंडरस्कोर नहीं हटाता है? माना जाता है कि निर्माण के दौरान रेगेक्स कार्यान्वयन द्वारा एक "शब्द" चरित्र माना जाता है, लेकिन यह अल्फ़ान्यूमेरिक, डैश या स्पेस नहीं है ... (?)
कोड जॉकी

14

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

public static class RegexConvert
{
    public static string ToAlphaNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z0-9]");
        return rgx.Replace(input, "");
    }

    public static string ToAlphaOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z]");
        return rgx.Replace(input, "");
    }

    public static string ToNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^0-9]");
        return rgx.Replace(input, "");
    }
}

तब विधियों का उपयोग इस प्रकार किया जा सकता है:

string example = "asdf1234!@#$";
string alphanumeric = example.ToAlphaNumericOnly();
string alpha = example.ToAlphaOnly();
string numeric = example.ToNumericOnly();

2
उदाहरण के लिए जो आप प्रदान करते हैं वह उपयोगी होगा यदि आप प्रत्येक विधि के परिणाम प्रदान करते हैं।
c-chavez

7

कुछ जल्दी चाहिए?

public static class StringExtensions 
{
    public static string ToAlphaNumeric(this string self, params char[] allowedCharacters)
    {
        return new string(Array.FindAll(self.ToCharArray(), c => char.IsLetterOrDigit(c) || allowedCharacters.Contains(c)));
    }
}

यह आपको यह निर्दिष्ट करने की अनुमति देगा कि आप किन पात्रों को अनुमति देना चाहते हैं।


5

यहाँ एक गैर-रेगेक्स हीप आवंटन अनुकूल तेज समाधान है जो मैं देख रहा था।

असुरक्षित संस्करण।

public static unsafe void ToAlphaNumeric(ref string input)
{
    fixed (char* p = input)
    {
        int offset = 0;
        for (int i = 0; i < input.Length; i++)
        {
            if (char.IsLetterOrDigit(p[i]))
            {
                p[offset] = input[i];
                offset++;
            }
        }
        ((int*)p)[-1] = offset; // Changes the length of the string
        p[offset] = '\0';
    }
}

और उन लोगों के लिए जो असुरक्षित उपयोग नहीं करना चाहते हैं या स्ट्रिंग की लंबाई हैक पर भरोसा नहीं करते हैं।

public static string ToAlphaNumeric(string input)
{
    int j = 0;
    char[] newCharArr = new char[input.Length];

    for (int i = 0; i < input.Length; i++)
    {
        if (char.IsLetterOrDigit(input[i]))
        {
            newCharArr[j] = input[i];
            j++;
        }
    }

    Array.Resize(ref newCharArr, j);

    return new string(newCharArr);
}

4

Ive ने नियंत्रण वर्णों को समाप्त करके एक अलग समाधान बनाया , जो मेरी मूल समस्या थी।

यह सभी "विशेष लेकिन अच्छे" वर्णों की सूची में डालने से बेहतर है

char[] arr = str.Where(c => !char.IsControl(c)).ToArray();    
str = new string(arr);

यह आसान है, तो मुझे लगता है कि यह बेहतर है!


2

प्रेरणा के रूप में @ उत्तर का उपयोग करके एक विस्तार विधि यहां दी गई है।

"hello-world123, 456".MakeAlphaNumeric(new char[]{'-'});// yields "hello-world123456"

या यदि आपको हाइफ़न के अलावा अतिरिक्त वर्णों की आवश्यकता है ...

"hello-world123, 456!?".MakeAlphaNumeric(new char[]{'-','!'});// yields "hello-world123456!"


public static class StringExtensions
{   
    public static string MakeAlphaNumeric(this string input, params char[] exceptions)
    {
        var charArray = input.ToCharArray();
        var alphaNumeric = Array.FindAll<char>(charArray, (c => char.IsLetterOrDigit(c)|| exceptions?.Contains(c) == true));
        return new string(alphaNumeric);
    }
}

1

मैं यहाँ एक उत्तर की भिन्नता का उपयोग करता हूँ। मैं रिक्त स्थान को "-" के साथ बदलना चाहता हूं ताकि इसका SEO फ्रेंडली हो और लोअर केस भी बना सके। मेरी सेवाओं की परत से भी system.web संदर्भ नहीं।

private string MakeUrlString(string input)
{
    var array = input.ToCharArray();

    array = Array.FindAll<char>(array, c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-');

    var newString = new string(array).Replace(" ", "-").ToLower();
    return newString;
}

0

यहाँ एक बहुत ही संस्करण है

myString = myString.replace(/[^A-Za-z0-9 -]/g, "");

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