2013-07-18 16 views
5

Moja terminologia może być trochę tutaj, ale próbuję usunąć litery z ciągu w C#, więc usuń kreseczki itp., Ale zachowaj rzeczy jak znaki akcentowane i chińskie znaki . Wszystkie przykłady C#, które widziałem na SO, mają takie wyrażenie regularne jak new Regex("[^a-zA-Z0-9 -]");, ale moje potrzeby wykraczają poza znaki ASCII.C# Regex literowe znaki z ciągu znaków

string input = "I- +AM. 相关 AZURÉE& /30%";

string output = "I AM 相关 AZURÉE 30";

+2

Co powiedzie się na usunięcie znaków, w których 'char.IsLetterOrDigit' zwraca wartość false? Coś jak 'var sb = new StringBuilder(); foreach (var c na wejściu) if (char.IsLetterOrDigit (c)) sb.Append (c); return sb.ToString(); '- nie próbowałem jednak. – Alxandr

Odpowiedz

4

Dobrym punktem wyjścia byłoby usunięcie znaków według ich Unicode character class. Na przykład, ten kod usuwa wszystko, co charakteryzuje się interpunkcji, symbolu lub znaku kontrolnego:

string input = "I- +AM. 相关 AZURÉE& /30%"; 
var output = Regex.Replace(input, "[\\p{S}\\p{C}\\p{P}]", ""); 

Można również spróbować podejścia białej listy, pozwalając jedynie przez niektórych klas. Na przykład ten utrzymuje tylko znaki, które są litery, cyfry i znaki diakrytyczne, rozstaw

var output = Regex.Replace(input, "[^\\p{L}\\p{M}\\p{N}\\p{Z}]", ""); 

See it in action.

+0

+1 Dla łącza demonstracyjnego Ideone. Ta strona jest całkiem fajna! Dobre znalezisko! –

1
string result = string.Concat(input.Where(c => Char.IsLetterOrDigit(c))); 
Powiązane problemy