Работа с регулярными выражениями, строками и числами c#

В данной заметке опишу некоторую работу с регулярными выражениями, строками и числами. В дальнейшем данная заметка будет постоянно дополняться.

  1. Экранирование слэшей и кавычек.
    В c# обратные слэши можно экранировать посредством символа @ в определении строки

    string emailPattern = @"\w+[-.\w]+@\w+[-.\w]+\.\w+[-.\w]+";
    // вместо
    emailPattern = "\\w+[-.\\w]+@\\w+[-.\\w]+\\.\\w+[-.\\w]+";
    

    Кавычки в c# экранируются путем дублирования этой самой кавычки если строка предваряется символом @

    string text = @"She said, ""You deserve a treat!""";
    

    Или если нет символа @, то как обычно слэшем

    string text = "She said, \"You deserve a treat!\"";
    

    С одинарные кавычки точно так же.

  2. Замена подстроки
    // заменяем все совпадения по данной подстроке, если подстрока простая
    string text = text.Replace(",", ".");
    // заменяем все совпадения по регулярному выражению
    string address = Regex.Replace(address, @"^,|,$", "");
    // или так 
    address = new Regex(@"^,|,$").Replace(address, "");
    
  3. Проверяем на совпадения
    if (new Regex(@"^\d+$").IsMatch(search))
    {
        // ...
    }
    
  4. Найдем все совпадения в исходной строке
    List<long> numbers = new List<long>();
    Regex r = new Regex(@"\d+");
    foreach (Match m in r.Matches(text)) // или вместо r: Regex.Matches(text, @"\d+")
    {
        numbers.Add(m.Value);
    }
    

    Парсим число с помощью Convert, Parse и TryParse

    int num = int.Parse("123");
    // или
    num = Convert.ToInt32("123");
    

    Два примера по сути идентичны и более того Convert.ToInt32() внутри себя вызывает int.Parse(). Отличия только в том что Convert.ToInt32() имеет перегрузки для других типов — object, long, int, bool, short и тп.
    Данные методы следует использовать только если известно что строка является числом, иначе бросится исключение.
    Если неизвестно что строка является числом, то используйте TryParse

    long num = 0, temp;
    if (long.TryParse("123 ", out temp))
        num = temp;
    // или Parse, если все же хочется отловить исключение
    num = 0;
    try
    {
        num = int.Parse("123 ");
    }
    catch(Exception e)
    {
        _logger.Error("Не удалось распарсить число: " + e.Message);
    }
    
  5. Разобьем строку на подстроки
    // если разделитель считается только один символ
    string[] numbers = "123,456,789".Split(',');
    // если множество разделителей
    numbers = "123,456,789.123".Split(new char[] { ',',  '.' });
    // если разделитель является строка или множество строк
    numbers = "123, 456, 789. 123".Split(new string[] { ", ", ". " }, StringSplitOptions.None);
    

    второй параметр StringSplitOptions.None почему-то обязательный. И нельзя передать одну строку.
    Используем регулярное выражение, чтобы учесть все случаи

    string[] numbers = Regex.Split("123, 456, 789. 123", @"\s*,\s*|\s*\.\s*")
    
  6. Соберем подстроки в одну строку
    string numbersAsString = string.Join(", ", numbers);
    
По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *