11 ответов:
заменить
[^a-zA-Z0-9 -]с пустой строкой.Regex rgx = new Regex("[^a-zA-Z0-9 -]"); str = rgx.Replace(str, "");
я мог бы использовать регулярное выражение, они могут обеспечить элегантное решение, но они могут вызвать проблемы performane. Вот одно решение
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);
Использование Системы.Linq
string withOutSpecialCharacters = new string(stringWithSpecialCharacters.Where(c =>char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray());
регулярное выражение
[^\w\s\-]*:
\sлучше использовать вместо пробела (), потому что в тексте может быть вкладка.
основываясь на ответе на этот вопрос, я создал статический класс и добавил их. Думал, что это может быть полезно для некоторых людей.
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();
Я сделал другое решение, устранив управления символы, которые были моей первоначальной проблемой.
это лучше, чем положить в список все "специальные, но хорошие" символы
char[] arr = str.Where(c => !char.IsControl(c)).ToArray(); str = new string(arr);его проще, так что я думаю, что его лучше !
хотите что-нибудь быстро?
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))); } }Это позволит вам указать, какие символы вы хотите разрешить, а также.
вот нерегулярное распределение кучи дружественное быстрое решение, которое было тем, что я искал.
небезопасных издание.
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] = ''; } }и для тех, кто не хочет использовать небезопасные или не доверяют длину строки взломать.
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); }
Я использую вариант одного из ответов здесь. Я хочу заменить пробелы на" -", чтобы его SEO-дружественный, а также сделать нижний регистр. Также не справочная система.из моего слоя служб.
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; }
есть гораздо более простой способ с помощью регулярных выражений.
private string FixString(string str) { return string.IsNullOrEmpty(str) ? str : Regex.Replace(str, "[\D]", ""); }
Comments