none
Вопрос по субстрокам RRS feed

  • Вопрос

  • По строкам в частности вопрос такой, как наиболее быстро и с наименьшей нагрузкой на железо найти среди слов в строке выражение заключенное в квадратные скобки ( [слово...] ) и записать его в переменную, отделив от скобок.

     

    • Изменено Abolmasov Dmitry 17 февраля 2011 г. 11:34 разделение вопросов
    16 февраля 2011 г. 16:25

Ответы

  • если закрывающая скобка отсутсвует то можно модифицировать пример

     

     for(int i=1;i<parts.Length;i++) 
     {
     int lastIdx=parts[i].LastIndexOf(']');
     if (lastIdx>0)
     {
      wordsInBr.Add(parts[i].Substring(0, lastIdx));
     }
     }
    

     

    приведите свой пример с неправильной скобкой.

    логика простая:

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

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

    в таком случае воспользуйтесь регуляркой, как показывали PashaPash и Abolmasov Dmitry выше

    • Помечено в качестве ответа Siompc 20 февраля 2011 г. 19:56
    17 февраля 2011 г. 14:24

Все ответы

  • Пожалуйста, не объединяйте разные вопросы в один топик, задайте 2ой вопрос (про tcp) отдельным топиком. Спасибо.
    Для связи [mail]
    16 февраля 2011 г. 16:37
  • Хорошо Дмитрий.
    16 февраля 2011 г. 17:14
  • Насколько большая предполагается строка? И вообще это строка или много строк, файл или нет?


    Для связи [mail]
    17 февраля 2011 г. 11:45
  • Примерно так (наименьшая нагрузка не гарантируется):

    string str = "заключенное в квадратные скобки ( [слово...] ) и записать";
    string word;
    var match = System.Text.RegularExpressions.Regex.Match(str, @"(?<=\[).*?(?=\])");
    if (match.Success)
    {
      word = match.Value;
    }


    My blog
    17 февраля 2011 г. 12:16
  • если вхождение одно, то достаточно

     

    string s = "aaaa[b bbbbbb] ccccc";
    string br = s.Substring(s.IndexOf('[')+1, s.Length-s.LastIndexOf(']'));
    

     

    тоже без претензий на наименьшую нагрузку)

     

    17 февраля 2011 г. 12:20
  • Подразумевается одна строка. В которой может быть любое кол-во выражений в скобках. Спасибо большое за предложенные варианты, попробуем все.
    17 февраля 2011 г. 13:16
  • если вхождений несколько, то попробуйте этот вариант

    теоретически он должен быть быстрее регулярки,

    хотя если нужна скорость надо писать в unsafe

    //тут будет результат
    List<string> wordsInBr = new List<string>();
    
    //источник
    string s = "aaaa[b bbbbbb] [gggg] cc[jjjj]ccc";
    
    //начало обработки
    string[] parts = s.Split('[');
    for(int i=1;i<parts.Length;i++) 
    {
     wordsInBr.Add(
      parts[i].Substring(0, parts[i].LastIndexOf(']')
      ));
    }
    
    foreach (string part in wordsInBr)
    {
    	//тут обработка результата
    }

    17 февраля 2011 г. 13:33
  • Да, хороший вариант, но одно но. В строке может отсутствовать одна из скобок... Это все и усложняет.
    17 февраля 2011 г. 13:53
  • В каком смысле "отсутствовать"? Можешь привести пример?
    My blog
    17 февраля 2011 г. 14:04
  • для нескольких слов:

    string str = "заключенное в квадратные скобки ( [слово...] ) и записать [куда-то]";
    var matches = System.Text.RegularExpressions.Regex.Matches(str, @"(?<=\[).*?(?=\])");
    string[] result = matches.Cast<System.Text.RegularExpressions.Match>().Select(m => m.Value).ToArray();
    


    My blog
    17 февраля 2011 г. 14:08
  • Для нескольких слов с неправильными скобками :)

        string str = "заключенное в квадратные скобки ( [сл[о]в[о.]..] ) и записать";
        foreach (Match match in Regex.Matches(str, @"(?<=\[)[^\[]*?(?=\])"))
        {
          Console.WriteLine(match.Value);
        }
    

    Для связи [mail]
    17 февраля 2011 г. 14:10
  • если закрывающая скобка отсутсвует то можно модифицировать пример

     

     for(int i=1;i<parts.Length;i++) 
     {
     int lastIdx=parts[i].LastIndexOf(']');
     if (lastIdx>0)
     {
      wordsInBr.Add(parts[i].Substring(0, lastIdx));
     }
     }
    

     

    приведите свой пример с неправильной скобкой.

    логика простая:

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

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

    в таком случае воспользуйтесь регуляркой, как показывали PashaPash и Abolmasov Dmitry выше

    • Помечено в качестве ответа Siompc 20 февраля 2011 г. 19:56
    17 февраля 2011 г. 14:24
  • Siompc, пожалуйства, отметьте ответы, которые решают вашу проблему с помощью кнопки "Пометить как ответ". Или если они не решают - то поставьте задачу более точно, желательно с примером. Спасибо.
    Для связи [mail]
    18 февраля 2011 г. 0:57
  • Уточните, пожалуйста, задачу: в строке могут быть вложенные скобки, как в этом примере: "[начало [середина] конец]"? Если да, то как нужно обрабатывать такие ситуации?

    По существу задачи: самый быстрый вариант, в общем случае (и если не рассматривать вариант с неуправляемым кодом), будет однопроходовый алгоритм с посимвольным сравнением и, если нужны вложенные элементы, подсчетом количества открытых скобок. Если задача все еще актуальна, могу привести пример.

    18 февраля 2011 г. 13:56
  • Пример такой - "я [ однажды [ пошел гулять, слово 28 [копировать] [ не копировать..." Что то в этом роде.
    20 февраля 2011 г. 19:41
  • А какой должен получиться результат для этой строки?
    20 февраля 2011 г. 20:06