Tire hariç bir dizeden alfasayısal olmayan tüm karakterleri nasıl kaldırabilirim?


606

Çizgi ve boşluk karakterleri dışında bir dizeden alfasayısal olmayan tüm karakterleri nasıl kaldırabilirim?

Yanıtlar:


870

[^a-zA-Z0-9 -]Boş bir dizeyle değiştirin .

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

79
Belirtmekte yarar -karakter sınıfının sonunda olabilir veya bir dizi için kullanılan önlemek için, ters eğik çizgiyle gerekir.
Peter Boughton

6
@Düzenliğinizde küresel bayrağı ayarlayabilir - bu olmadan, sadece ilk maçı değiştirir. Hızlı bir google size klasik ASP normal ifadesinde genel bayrağı nasıl ayarlayacağınızı söylemelidir. Aksi takdirde, replaceAllyerine bir işlev arayın replace.
Amarghosh

20
İşte regex derlenmiş versiyonu: return Regex.Replace(str, "[^a-zA-Z0-9_.]+", "", RegexOptions.Compiled); Aynı temel soru
Paige Watson

13
@MGOwen çünkü "" işlevini her kullandığınızda, dizelerin değişmez olması nedeniyle yeni bir nesne oluşturuyorsunuz. String.empty komutunu kullandığınızda, daha hızlı olmasının yanı sıra daha verimli olan boş bir dizeyi temsil etmek için gereken tek örneği yeniden kullanırsınız.
Brian Scott

17
@BrianScott Bunun eski olduğunu biliyorum, ancak bir aramada bulundu, bu yüzden bunun alakalı olduğunu hissediyorum. Bu aslında altında çalıştırdığınız .NET sürümüne bağlıdır. > 2.0 kullanır ""ve string.Emptytamamen aynıdır. stackoverflow.com/questions/151472/…
Jared

348

RegEx'i kullanabilirdim, zarif bir çözüm sağlayabilirler ama performans sorunlarına neden olabilirler. İşte bir çözüm

char[] arr = str.ToCharArray();

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

Kompakt çerçeveyi kullanırken (FindAll içermeyen)

FindAll yerine 1

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

str = new string(arr);

1 yorum tarafından ShawnFeatherly


41
Testlerimde bu teknik çok daha hızlıydı. kesin olmak gerekirse, Regex Replace tekniğinden 3 kat daha hızlıydı.
Dan

12
Kompakt çerçevede FindAll yoktur, char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-')).ToArray();
FindAll'ı

2
bunu test eden var mı? Hiç işe yaramadı. - ama bu benim için yaptı: string str2 = new string (str.Where (c => (char.IsLetterOrDigit (c))). ToArray ());
KevinDeus

48

Deneyebilirsin:

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

Dizeniz nerede s.


1
OP çizgi alt çizgi değil istedi
Sean B

39

System.Linq kullanma

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

@Michael Benzer ama en azından bu 3 satır yerine bir astar. Farklı bir cevap yapmak için yeterli olduğunu söyleyebilirim.
Dymas

1
@Dymas Artık kabul edilebilir olduğunu kabul ediyorum, ancak boşluk farklı olduğu için değil . Görünüşe göre işlevsel olarak eşdeğer olan kısım (sadece var isimleri farklıdır) bu cevap yazıldıktan sonra düzenlendi.
Michael - Clay Shirky

1
@ZainAli, önemsiz bir düzenleme yapar ve bana ping işlemi yaparsanız, downvote'umu tersine çeviririm. Herhangi bir intihal için özür dilerim.
Michael - Clay Shirky

22

Normal ifade [^\w\s\-]*:

\smetinde bir sekme olabileceğinden space ( ) yerine kullanmak daha iyidir .


1
sekmeleri kaldırmak istemiyorsanız.
Matt Ellen

... ve yeni satırlar ve diğer tüm karakterler "boşluk" olarak kabul edilir.
Peter Boughton

6
Bu çözüm, uluslararası (İngilizce olmayan) karakterleri de desteklediğinden, yukarıdaki çözümlerden çok daha üstündür. <! - dil: c # -> string s = "Mötley Crue 日本人: の 氏 名 ve Kanji 愛 ve Hiragana あ い"; string r = Regex.Replace (s, "[^ \\ w \\ s -] *", ""); Yukarıdaki ile r üretir: Mötley Crue 日本人 の 氏 名 ve Kanji 愛 ve Hiragana あ い
danglund

1
Dizede

1
uhhh ... alt çizgileri kaldırmıyor mu? yaratılış boyunca normal ifade uygulamasıyla "kelime" karakteri olarak kabul edilir, ancak alfasayısal, tire veya boşluk değildir ... (?)
Kod Jokey

14

Bu sorunun cevabına dayanarak, statik bir sınıf oluşturdum ve bunları ekledim. Bazı insanlar için yararlı olabileceğini düşündüm.

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, "");
    }
}

Daha sonra yöntemler şu şekilde kullanılabilir:

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

2
Sağladığınız örnek için, yöntemlerin her birinin sonuçlarını sağlarsanız da yararlı olacaktır.
c-chavez

7

Hızlı bir şey ister misiniz?

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

Bu, hangi karakterlere izin vermek istediğinizi belirtmenize olanak tanır.


5

İşte aradığım şeydi regex olmayan bir yığın ayırma dostu hızlı çözüm.

Güvenli olmayan sürüm.

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';
    }
}

Ve güvensiz kullanmak istemeyen veya ip uzunluğu kesmek güvenmeyenler için.

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

Asıl sorunum olan Kontrol karakterlerini ortadan kaldırarak farklı bir çözüm yaptım .

Tüm "özel ama iyi" karakterleri bir listeye koymaktan daha iyidir

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

daha basit, bu yüzden daha iyi olduğunu düşünüyorum!


2

İşte @ata yanıtını ilham olarak kullanan bir uzantı yöntemi .

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

veya kısa çizgi dışında ek karakterlere ihtiyacınız varsa ...

"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

Burada cevaplardan birinin varyasyonunu kullanıyorum. Ben onun SEO dostu ve aynı zamanda küçük harf yapmak "-" ile boşlukları değiştirmek istiyorum. Ayrıca services katmanımdan system.web dosyasına başvurmayın.

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

İşte çok kısa bir versiyon

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

-1

Regex ile çok daha kolay bir yol var.

private string FixString(string str)
{
    return string.IsNullOrEmpty(str) ? str : Regex.Replace(str, "[\\D]", "");
}

1
yalnızca sayısal olmayan karakterlerin yerini alır
frostymarvelous
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.