Фильтровать строку - PullRequest
       11

Фильтровать строку

14 голосов
/ 26 мая 2009

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

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

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

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

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

Эта функция TrimStart () работает только с буквами без других символов, таких как $% и т. Д.

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

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

Мысли

Спасибо!

Ответы [ 6 ]

33 голосов
/ 26 мая 2009

Это вполне допустимая причина для использования регулярного выражения .

bool stringIsValid = Regex.IsMatch(inputString, @"^[a-zA-Z0-9\-]*?$");

В ответ на комментарий Мигеля вы можете сделать это, чтобы удалить все нежелательные символы:

string cleanString = Regex.Replace(inputString, @"[^a-zA-Z0-9\-]", "");

Обратите внимание, что символ вставки (^) теперь помещается внутри класса символов, что отрицает его (соответствует любому недопустимому символу).

13 голосов
/ 26 мая 2009

Вот забавный способ сделать это с 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 голосов
/ 26 мая 2009

Попробуйте следующее

public bool isStringValid(string input) {
  if ( null == input ) { 
    throw new ArgumentNullException("input");
  }
  return System.Text.RegularExpressions.Regex.IsMatch(input, "^[A-Za-z0-9\-]*$");
}
1 голос
/ 26 мая 2009

Я уверен, что, потратив немного больше времени, вы сможете придумать что-то лучше, но это даст вам хорошую идею:

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(" ", "");
}
1 голос
/ 26 мая 2009

Почему бы просто не использовать замену? Trimstart удалит только первые символы в вашем списке ...

0 голосов
/ 01 сентября 2018

Я протестировал эти два решения в Linqpad 5. Их преимущество заключается в том, что они могут использоваться не только для целых чисел, но также для десятичных чисел / чисел с разделителем десятичных чисел, который зависит от культуры. Например, в Норвегии мы используем запятую в качестве десятичного разделителя, тогда как в США используется точка. Запятая используется там как разделитель тысяч. В любом случае, сначала версия Linq, а затем версия Regex. Самый краткий бит - доступ к статическому свойству Thread для разделителя чисел, но вы можете сжать его немного, используя static в верхней части кода, или, что еще лучше, - поместить такую ​​функциональность в методы расширения C #, предпочтительно с перегрузками с произвольными шаблонами Regex.

string crappyNumber = @"40430dfkZZZdfldslkggh430FDFLDEFllll340-DIALNOWFORCHRISTSAKE.,CAKE-FORFIRSTDIAL920932903209032093294faøj##R#KKL##K";

string.Join("", crappyNumber.Where(c => char.IsDigit(c)|| c.ToString() == Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator)).Dump();

new String(crappyNumber.Where(c => new Regex($"[\\d]+{Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator}\\d+").IsMatch(c.ToString())).ToArray()).Dump();

Обратите внимание на приведенный выше код, метод Dump () выводит результаты в Linqpad. Ваш код, конечно, пропустит эту самую последнюю часть. Также обратите внимание, что мы сократили его до однострочного, но он немного многословен и может быть добавлен в методы расширения C #, как было предложено.

Кроме того, вместо string.join, новый объект String имеет более компактный синтаксис и меньше подвержен ошибкам.

Мы получили дерьмовый номер в качестве ввода, но нам удалось получить наш номер в конце! И это культура осведомлена в C #!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...