È possibile utilizzare
Regex.Replace(myString, @"[^\x20-\xaf]+", "");
La regex qui è costituito da una classe di caratteri ([...]
) composto da tutti i caratteri non (^
al via della classe) nella gamma di U + 0020 a U + 00AF (32-175, espresso in notazione esadecimale). Per quanto riguarda le espressioni regolari, questo è piuttosto basilare, ma potrebbe essere difficile convincere qualcuno che non lo conosce molto bene.
Ma si può andare un altro percorso così:
new string(myString.Where(c => (c >= 32) && (c <= 175)).ToArray());
Questo dipende probabilmente in gran parte su ciò che si è più a suo agio con la lettura. Senza troppe esperienze regex direi che la seconda sarebbe più chiara.
Qualche misurazioni delle prestazioni, 10000 colpi ciascuno, in pochi secondi:
2000 characters, the first 143 of which are between 32 and 175
Regex without + 4.1171
Regex with + 0.4091
LINQ, where, new string 0.2176
LINQ, where, string.Join 0.2448
StringBuilder (xanatos) 0.0355
LINQ, horrible (HatSoft) 0.4917
2000 characters, all of which are between 32 and 175
Regex without + 0.4076
Regex with + 0.4099
LINQ, where, new string 0.3419
LINQ, where, string.Join 0.7412
StringBuilder (xanatos) 0.0740
LINQ, horrible (HatSoft) 0.4801
Quindi sì, i miei approcci sono il più lento :-). Probabilmente dovresti andare con la risposta di xanatos e avvolgerla in un metodo con un nome bello e chiaro. Per uso in linea o cose veloci e sporche o in cui le prestazioni non contano, probabilmente utilizzerei la regex.
Non puoi semplicemente rimuoverli con la normale indicizzazione delle stringhe? La stringa di destinazione può essere allocata come la stessa lunghezza della stringa di origine, in quanto è garantita la stessa lunghezza o minore. Quindi copiare solo caratteri validi in un ciclo? Sono solo due i confronti da verificare validi. –
E un'altra copia di 'char []' perché la stringa sarebbe della stessa lunghezza di prima, solo con padding zero in questo modo. – Joey