Итак, я хотел разбить регуляркой такую сроку:
aaaaa bbb "ccc ссс"
На такой массив:
[0] = aaaaa 
[1] = bbb 
[2] = ccc ссс
Когда-то давно я уже задавал такой вопрос, на что мне ответили таким вот паттерном:
[^\s"']+|"([^"]*)"|'([^']*)'
И все бы хорошо, но теперь мне понадобилось сохранять…
Вопрос
9 2 704
20
    class Program
    {
        static void Main()
        {
            Console.OutputEncoding = Encoding.UTF8;
            string s = "aaa bbb 'ccc' \"ddd\"";
            Regex regex = new Regex(@"[^\s""']+|""([^""]*)""|'([^']*)'");
            MatchCollection matches = regex.Matches(s);
            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                    Console.WriteLine(match.Value);
            }
            else
            {
                Console.WriteLine("Совпадений не найдено");
            }

            Console.Read();
        }
    }
Проверьте что выводит этот пример у вас? Используется ваш регекс
8
Nerevar, я, наверно, не так выразился. Находит то он правильно, но мне нужно, чтобы в группу кавычки/апострофы попадали тоже, т.е. не:
"hello" world => [hello] [world]
А так:
"hello" world => ["hello"] [world]
20
Твой паттерн находит все как надо - и одинарные и двойны кавычки и пробелы между словами внутри кавычек
8
pro100master, в регулярках я почти полный ноль, можно пример? Мне проще подобное сделать без регулярок, но все же хотелось бы на них, вместо того, чтобы городить свой костыль.
22
тогда делай правило если пробел то разделить а если ковычка то запрешаем пробел

C# Делегаты и события

В данной статье рассматриваются базовые операции над делегатами, их производными и связующими.
Статья
7 5 603
27
даже базовый тип ничего не сделает, т.к. под капотом 'i' будет находиться в экземпляре делегата, и это будет один и тот же экземпляр во всех элементах списка.
На выходе компилятора будет примерно вот такое:
    public void Do()
    {
      List<Action> actionList = new List<Action>();
      DisplayClass displayClass = new DisplayClass();
      for (displayClass.i = 0; displayClass.i < 3; displayClass.i++)
      {
        actionList.Add(new Action((object) displayClass, __methodptr(<Do>b__0)));
      }
    }

    [CompilerGenerated]
    private sealed class DisplayClass
    {
      public int i;

      internal void <Do>b__0()
      {
        Console.Write((object) this.i);
      }
    }
т.к. вся лямбда внутри контекста захваченных переменных будет формировать отдельный класс то по факту замыкания не будет, если вынести лямбду в отдельный от цикла метод.
Так же можно создать переменную со значением и записать туда i, и уже эту переменную прокинуть в лямбду, в этом случае будет создаваться отдельный экземпляр делегата каждый виток цикла (но в старых версиях компилятора это будет работать иначе, что вроде как баг, ибо для пользователя оно по факту должно выглядеть как "передача ссылки").
Бтв, тут всплывает тема с аллокацией, т.к. как ты можешь заметить создание экземпляра каждый виток цикла это дичь )
38
Про последнее, оно замыкает по ссылке даже базовый тип? Хотя вроде это везде так вроде, кроме пхп и вроде c++11, там надо явно указать.
27
Имхо еще что можно сделать по теме, чуть посложнее чем для новичков, но интересно:
# объяснить подробнее про вычитание списка делегатов
Например, разъяснить почему:
  Action a = () => Console.Write("A");
  Action b = () => Console.Write("B");
  Action c = () => Console.Write("C");
  Action s = a + b + c;
  (s - (b + c))();      //A
  //но при этом
  (s - (a + c))();      //ABC
Упомянуть про порядок вычитания, например
s = a + b + a;
(s - a)(); //AB, а не BA

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

например, как тут:
    string str = "str1";
    Action d1 = () => Debug.Log(str); //аллоцирует при каждом вызове метода, который объявляет d1
    Action d2 = () => Debug.Log("str1"); //аллоцирует лишь однажды

рассказать про неявный захват переменных

Например объяснить, почему если очистить 'd1', 'a' останется в памяти до очистки 'd2'
    var a = new object();;
    var b = new object();
    
    Action d1 = () =>
    {
        Debug.Log(a);
        Debug.Log(b);
    };
    Action d2 = () => Debug.Log(b);

ну и про замыкания само собой, т.е. почему вот это выведет 333

    var actions = new List<Action>();
    for (int i = 0; i < 3; i++)
        actions.Add(() => Console.Write(i));

    foreach (var action in actions)
        action();