Фильтрация строки
Я хочу убедиться, что строка содержит только символы в этом диапазоне
[a-z] && [A-Z] && [0-9] && [-]
поэтому все буквы и цифры плюс дефис.
Я пробовал это...
Приложение С#:
char[] filteredChars = { ',', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '{', '}', '[', ']', ':', ';', '"', '\'', '?', '/', '.', '<', '>', '\\', '|' };
string s = str.TrimStart(filteredChars);
Этот TrimStart(), похоже, работает только с буквами, не имеющими других символов, например $% и т.д.
Я сделал это неправильно?
Есть ли лучший способ сделать это?
Я просто хочу избежать циклирования каждой проверки индекса строки, потому что будет много строк...
Мысли?
Спасибо!
Ответы
Ответ 1
Это кажется вполне обоснованной причиной использования регулярного выражения .
bool stringIsValid = Regex.IsMatch(inputString, @"^[a-zA-Z0-9\-]*?$");
В ответ на комментарий miguel вы можете сделать это, чтобы удалить все нежелательные символы:
string cleanString = Regex.Replace(inputString, @"[^a-zA-Z0-9\-]", "");
Обратите внимание, что карет (^
) теперь помещается внутри класса символов, тем самым отрицая его (сопоставляя любой недопустимый символ).
Ответ 2
Здесь интересный способ сделать это с LINQ - без уродливых петель, без сложного RegEx:
private string GetGoodString(string input)
{
var allowedChars =
Enumerable.Range('0', 10).Concat(
Enumerable.Range('A', 26)).Concat(
Enumerable.Range('a', 26)).Concat(
Enumerable.Range('-', 1));
var goodChars = input.Where(c => allowedChars.Contains(c));
return new string(goodChars.ToArray());
}
Подайте его "Привет, мир? 123!" и он вернет "Helloworld123".
Ответ 3
Попробуйте выполнить
public bool isStringValid(string input) {
if ( null == input ) {
throw new ArgumentNullException("input");
}
return System.Text.RegularExpressions.Regex.IsMatch(input, "^[A-Za-z0-9\-]*$");
}
Ответ 4
Почему бы просто не использовать вместо этого замену? Trimstart удалит только лидирующие символы в вашем списке...
Ответ 5
Я уверен, что с немного большим временем вы можете придумать что-то лучше, но это даст вам хорошую идею:
public string NumberOrLetterOnly(string s)
{
string rtn = s;
for (int i = 0; i < s.Length; i++)
{
if (!char.IsLetterOrDigit(rtn[i]) && rtn[i] != '-')
{
rtn = rtn.Replace(rtn[i].ToString(), " ");
}
}
return rtn.Replace(" ", "");
}