2013-07-09 13 views
5

Yalnızca alfasayısal karakterlere, alt çizgi, nokta ve eksi (tire) karakter gibi birkaç taneye izin veren bir 'temiz' işlevi yazmaya çalışıyorum.Alt çizgi ile istenmeyen karakterleri değiştirmek için bir RegEx oluşturabilir misiniz?

Şu anda işlevimiz, kaynak dizgisinin düz char iterasyonunu kullanmaktadır, ancak onu okuduğum kadarıyla, daha temiz ve daha performanslıdır (ki bu bana geriye doğru görünüyor). düz yineleme, ancak ben bir çalışma RegEx alıncaya kadar onu profilleyemiyorum.)

Sorun benim için iki misli. Birincisi, şu regex ...

[a-zA-Z0-9] 

... alfanümerik karakterlerden oluşan bir dizi ile eşleşen biliyorum ama nasıl ben de çizgi, nokta ve eksi karakteri eklerim? Onları '\' karakteri ile kaçar ve geri kalanı ile parantez arasında koyar mısınız?

İkincisi, eşleşmenin bir parçası olmayan herhangi bir karakter için (yani '?' Gibi başka bir noktalama işareti), bunun yerine alt çizgi yerleştirilmesini istiyoruz.

Düşüncem, istenen bir dizi karakterle eşleşmesidir, istenilen aralıkta olmayan tek bir karakterle eşleşir, sonra bunu değiştiririz. Ben

[^a-zA-Z0-9] 

doğru bir yaklaşım mı ... bunun için RegEx böyle parantez arasındaki ilk karakteri olarak kırat dahil etmek olduğunu düşünüyorum? Eğer istemediğiniz karakterleri kaldırmak için çalışıyorsanız

+0

Regex.Replace() yöntemi ben bakın, ama anladım sen – terrybozzio

+0

gerekenler Benim sorum ya da bununla ilgili iki soru. – MarqueIV

+1

Karakter sınıfınızı tersine çevirmek istiyorsunuz. yani. [^ a-zA-Z0-9] ', _not_ alfasayısal olan herşeyle eşleşecektir. –

cevap

5

Bunu yapmanın en etkili yolu, değiştirmek istediğiniz karakterleri tanımlayan statik bir Regex oluşturmaktır. Ancak

public static class StringCleaner 
{  
    public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-]", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

    public static string ReplaceInvalidChars(string input) 
    { 
     return invalidChars.Replace(input, "_"); 
    } 
} 

, Regex'in hattını değiştirmek istemiyorsanız biter ve (boşluklar ve sekmeler gibi) boşluk biraz daha farklı bir ifade kullanmak gerekir.göründüğü yalnızca

köşeli parantez ile gösterilir kümesi içinde bu -#]\ yerde meydana karakterler ve ^ kaçmak gerekir:

public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-\s]", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

Ayrıca, burada edebi karakteri eşleştirmek için kaçmak zorundadır ne için kurallardır setin ilk konumunda, harf karakterleri ile eşleşecek şekilde. Bir kümenin dışında, şu karakterlerden kaçmanız gerekir: .$^|{}[]()+?#, değişmez karakteri eşleştirmek için.

fazla bilgi için aşağıdaki belgelere bakın:

+0

Aslında, ben * istiyorum * Tüm boşlukları ve satır sonlarını (ve satır başlangıçları!) değiştirin.Onlar doğru olmayan bir karakter değil, yanlış yazıyorlar, ancak ben yanlışsa, beni düzeltin, ancak '@' karakteriyle harfli dizelerinizi başlatıyorsunuz Nesne C, C# gibi görünmüyor ... ya da bir şey özlüyor muyum? – MarqueIV

+0

Bir şey özlüyorum! :) C# içinde bir dizgeyi başlatmanın artık sizin için tüm dizgeden kurtulduğunu biliyorum. Bunu sevdim! Tamlığınız için kabul edilen cevabı alırsınız. Teşekkürler! :) – MarqueIV

+1

Evet, @ ile C ile başlayan bir dizgeyi başlatabilirsiniz. Bu, bunu açıklayan dil özelliğinin bir kısmı: http://msdn.microsoft.com/en-us/library/aa691090(v=VS. 71) .aspx – JamieSee

3

, daha iyi Regex.Replace tarafından hizmet ediyorum:

string cleaned = Regex.Replace(input, "[^a-zA-Z0-9_.]|-", "_"); 

eklemek için '-' sadece normal ifadeyle kullanabilirsiniz VEYA dahil etmek karakteri Bu karakter, muhtemelen karakter sınıfına dahil edilmesinin bir yolu olsa da, şu anda beni kaçıyor.

Düzenleme: Aslında bir tire eklemeniz gerekmez, çünkü yine de sınıfla eşleşmiyor. Yani, tire alt çizgi ile değiştirmek isterseniz, sadece sınıfınız olarak [^a-zA-Z0-9_.] kullanın ... bu sınıflarla uyuşmayan her şey değiştirilecektir. Ancak, bir sınıfa tire eklemenin doğru yolu, ters eğik çizgi (\-) ile kaçmak ya da sınıf listesinin dilenmesine koyabilirsiniz: [^-a-zA-Z0-9_.].

0

Dizenin Değiştir yöntemini kullanmanın mükemmel olacağını düşünüyorum.

public string StringClean(string source, char replacement, char[] targets) 
{ 
    foreach(char c in targets) 
    { 
    //... 
    } 
} 

(Not VS belki değil mükemmel kodu)

+0

Bu regex kodu değil, sorulan soru için geçerli değil. – MarqueIV

0

Bunu bir alt çizgi ile tarif desen olmayan tüm karakterleri değiştirmek gerekiyorsa: Muhtemelen

string result = Regex.Replace(YourOriginalString, "[^a-zA-Z0-9_.-]", "_"); 
+0

Sonunda bu tire dışına çıkmanız gerekmiyor mu (ya da örtük olarak kaçtı çünkü * sonunda * * – MarqueIV

+0

örtük, sadece denenmiş ve işe yaradı.) – terrybozzio

İlgili konular