Подтвердить что ты не робот

Фильтрация строки

Я хочу убедиться, что строка содержит только символы в этом диапазоне

[a-z] && [A-Z] && [0-9] && [-]

поэтому все буквы и цифры плюс дефис. Я пробовал это...

Приложение С#:

        char[] filteredChars = { ',', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '{', '}', '[', ']', ':', ';', '"', '\'', '?', '/', '.', '<', '>', '\\', '|' };
        string s = str.TrimStart(filteredChars);

Этот TrimStart(), похоже, работает только с буквами, не имеющими других символов, например $% и т.д.

Я сделал это неправильно? Есть ли лучший способ сделать это?

Я просто хочу избежать циклирования каждой проверки индекса строки, потому что будет много строк...

Мысли?

Спасибо!

4b9b3361

Ответ 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(" ", "");
}