Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Регулярные выражения в цикле


Автор: Suppir 11.3.2012, 13:12
1. Мне нужно использовать несколько регулярных выражений при переборе массива. Но код работает слишком медленно (на Perl быстрей в несколько раз). Что делаю не так?

Код

            for (int x = 0; x < gar.Length; x++)
            {
                gar[x] = Regex.Replace(gar[x], "^\\d+\\t", "", RegexOptions.Compiled);
                gar[x] = Regex.Replace(gar[x], "[  ]+", " ", RegexOptions.Compiled);
                gar[x] = Regex.Replace(gar[x], "[“”]", "\"", RegexOptions.Compiled);
                resultGar += gar[x] + "\r\n\r\n";
            }




2. Как вернуть 1, если первым символом строки gar[x] является знак "(" ?


Автор: Stolzen 11.3.2012, 13:17
Массив большой?

Автор: Suppir 11.3.2012, 13:19
5000 элементов. 

Мне кажется, что проблема в использовании регулярных выражений внутри цикла. Но Perl обрабатывает моментально (на порядок быстрей). Как правильно объявлять такие регулярные выражения?

Если то что  "искать" объявлять вне цикла, а то, на что заменить - внутри, то код непонятным становится. 

Автор: Stolzen 11.3.2012, 13:26
5000? Попробуйте StringBuilder для соединения строк

Автор: Suppir 11.3.2012, 13:32
Т.е. проблема не в регулярных выражениях, а в соединении строк?

И еще, обязательно ли использовать RegexOptions.Compiled или можно обойтись без него?

Автор: Stolzen 11.3.2012, 13:34
Цитата(Suppir @  11.3.2012,  14:32 Найти цитируемый пост)
Т.е. проблема не в регулярных выражениях, а в соединении строк?

Думаю, что в соединениях, да. 

Цитата(Suppir @  11.3.2012,  14:32 Найти цитируемый пост)
И еще, обязательно ли использовать RegexOptions.Compiled или можно обойтись без него? 

http://www.codinghorror.com/blog/2005/03/to-compile-or-not-to-compile.html гляньте тут. Вообще не возьмусь однозначно утверждать, лучше это сделает кто-то более осведомленный. 

Автор: Suppir 11.3.2012, 13:35
А по этому вопросу можете подсказать?

Как вернуть "true", если первым символом строки gar[x] является знак "(" ?

Автор: Stolzen 11.3.2012, 13:41
Код

if (gar[x].StartsWith("(")) 
{
    return true;
}

Автор: Suppir 11.3.2012, 13:41
Спасибо!

Добавлено через 4 минуты и 45 секунд
А еще, можно без регулярных выражений узнать, что
строка оканчивается на символ ">", после которого может быть, а может и не быть пробел?

Автор: Stolzen 11.3.2012, 14:01
Код

s.EndsWith(">") || s.EndsWith("> ")

Автор: Suppir 11.3.2012, 14:03
Еще один вопрос, пока вы не ушли!

У меня приложение с GUI.  После InitializeComponent() выполняются еще две функции. Но при запуске GUI отрисовывается только после того, как эти функции выполнятся. Мне же нужно, чтобы приложение сначала отрисовалось, а только потом эти функции запустились. Как это сделать?

Код

        public Form1()
        {
            InitializeComponent();
            LoadFiles();
            Prepare();
        }

Автор: Stolzen 11.3.2012, 14:06
В событие Load формы добавить это

Автор: Suppir 11.3.2012, 14:11
А где это нужно прописать?

Код

namespace Программа
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            LoadFiles();
            Prepare();
        }
     }
}



То есть где нужно объявлять функции   LoadFiles() и  Prepare(), чтобы они выполнялись уже после того, как форма будет отображена?

Автор: Stolzen 11.3.2012, 14:14
Не помню smile Где-то в свойствах формы в IDE можно выбрать вкладку "события" и там нужно будет найти Load.

Автор: Suppir 11.3.2012, 14:17
Нашел. Написал вот так, но все равно, сначала эти функции отрабатываются, а только потом форма отображается. А нужно, чтобы сначала запустилась программа, а потом начали функции отрабатывать. 

Код

namespace Программа
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
     }

     private void Form1_Load(object sender, EventArgs e)
     {
            LoadFiles();
            Prepare();
     }

}


Автор: LOPUH 12.3.2012, 04:09
Скорее всего, проблема в неправильно выбранном событии. СобытиеForm_Load происходит при загрузке формы, т.е.  до ее прорисовки. Попробуйте выбрать другое событие, например Form_Shown

Автор: Suppir 12.3.2012, 09:45
Спасибо, попробую. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)