powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Оптимизация регулярок
4 сообщений из 4, страница 1 из 1
Оптимизация регулярок
    #39332003
Artprog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для приведения наименований, артикулов и брендов используется следующий набор регулярок:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 
Regex regAll = new Regex("[^A-Za-zА-Яа-я0-9:()-.,/ ]"); //Убираем все лишние знаки
var art = Regex.Replace(outsideProduct.Article, @"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>", String.Empty, RegexOptions.IgnoreCase);         //очищаем артикул от тегов
                    outsideProduct.Article = Regex.Replace((((regAll.Replace(art, "")).Trim()).Replace("\n", "")), @"\s+", " ", RegexOptions.IgnoreCase);               //Удаляем лишние символы и пробелы
                    var brName = Regex.Replace(outsideProduct.BrandName, @"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>", String.Empty, RegexOptions.IgnoreCase);    //очищаем бренд от тегов
                    outsideProduct.BrandName = Regex.Replace((((regAll.Replace(brName, "")).Trim()).Replace("\n", "")), @"\s+", " ", RegexOptions.IgnoreCase);          //Удаляем лишние символы и пробелы
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>", String.Empty, RegexOptions.IgnoreCase);    //очищаем наименование от тегов
                    outsideProduct.Name = (regAll.Replace(outsideProduct.Name, "")).Replace("\n", "");                                                                  //Удаляем лишние символы и переносы строк
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + Regex.Escape(outsideProduct.Article) + @")", String.Empty, RegexOptions.IgnoreCase);//Удаляем артикул из наименования
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.ArticleClear + @")", String.Empty, RegexOptions.IgnoreCase);         //Удаляем очищенный артикул из наименования
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + Regex.Escape(outsideProduct.BrandName) + @")", String.Empty, RegexOptions.IgnoreCase);//Удаляем бренд из наименования
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.BrandNameClear + @")", String.Empty, RegexOptions.IgnoreCase);       //Удаляем очищенный ьренд из наименования
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"\s+", " ");                                                                              //Приводим пробелы в порядок
                    outsideProduct.Name = outsideProduct.Name[0].ToString().ToUpper() + outsideProduct.Name.Substring(1, outsideProduct.Name.Length - 1);               //Заменяем первую букву на заглавную
                    outsideProduct.Name = outsideProduct.Name.Trim(); 


Пожалуйста, помогите оптимизировать этот код. На 100к строк секунд 6 уходит
...
Рейтинг: 0 / 0
Оптимизация регулярок
    #39332005
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не вникая в суть самих регулярок, можно (нужно) использовать заранее скомпилированные регулярки. На 100к повторах должно заметно повысить производительность
...
Рейтинг: 0 / 0
Оптимизация регулярок
    #39332030
Artprog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proне вникая в суть самих регулярок, можно (нужно) использовать заранее скомпилированные регулярки. На 100к повторах должно заметно повысить производительность

Спасибо, за совет. Переделал на:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var regAll = new Regex("[^A-Za-zА-Яа-я0-9:()-.,/ ]", RegexOptions.Compiled & RegexOptions.IgnoreCase);
var regTags = new Regex(@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>", RegexOptions.Compiled & RegexOptions.IgnoreCase);
var regSpaces = new Regex(@"\s+", RegexOptions.Compiled & RegexOptions.IgnoreCase);

foreach (...)
{
var art = regTags.Replace(outsideProduct.Article, String.Empty);         //очищаем артикул от тегов
                    outsideProduct.Article = regSpaces.Replace(regAll.Replace(art, ""), " ").Trim();               //Удаляем лишние символы и пробелы
                    var brName = regTags.Replace(outsideProduct.BrandName, String.Empty);    //очищаем бренд от тегов
                    outsideProduct.BrandName = regSpaces.Replace(regAll.Replace(brName, ""), " ").Trim();            //Удаляем лишние символы и пробелы
                    outsideProduct.Name = regTags.Replace(outsideProduct.Name, String.Empty);    //очищаем наименование от тегов
                    outsideProduct.Name = regAll.Replace(outsideProduct.Name, "").Replace("\n", "");                                                                  //Удаляем лишние символы и переносы строк
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.Article + @")", String.Empty, RegexOptions.IgnoreCase & RegexOptions.Compiled);//Удаляем артикул из наименования
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.ArticleClear + @")", String.Empty, RegexOptions.IgnoreCase & RegexOptions.Compiled);         //Удаляем очищенный артикул из наименования
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.BrandName + @")", String.Empty, RegexOptions.IgnoreCase & RegexOptions.Compiled);//Удаляем бренд из наименования
                    outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.BrandNameClear + @")", String.Empty, RegexOptions.IgnoreCase & RegexOptions.Compiled);       //Удаляем очищенный ьренд из наименования
                    outsideProduct.Name = regSpaces.Replace(outsideProduct.Name, " ").Trim();                                                                              //Приводим пробелы в порядок
                    if (outsideProduct.Name.Length < 3) continue;
                    outsideProduct.Name = outsideProduct.Name[0].ToString().ToUpper() + outsideProduct.Name.Substring(1, outsideProduct.Name.Length - 1);
} 



Выиграл секунду. Но, насколько я понимаю, вот здесь:
Код: c#
1.
 outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.Article + @")", String.Empty, RegexOptions.IgnoreCase & RegexOptions.Compiled);


для каждой строки будет компилироваться отдельный экземпляр регэкспа, т.е. подставляемое значение артикула изменяется каждый раз. А скомпилированные регэкспы не высвобождаются из памяти, как указано на мсдн.
...
Рейтинг: 0 / 0
Оптимизация регулярок
    #39332033
Artprog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал объединить несколько регулярок в одну:
Код: c#
1.
2.
3.
4.
5.
6.
 var regAll = new Regex(@"([^A-Za-zА-Яа-я0-9:()-.,/ ])|((?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>)", RegexOptions.Compiled & RegexOptions.IgnoreCase);
и
outsideProduct.Name = Regex.Replace(outsideProduct.Name, @"(" + outsideProduct.Article + @")|"
                                                + "(" + outsideProduct.ArticleClear + ")|"
                                                + "(" + outsideProduct.BrandName + ")|"
                                                + "(" + outsideProduct.BrandNameClear + ")", String.Empty, RegexOptions.IgnoreCase & RegexOptions.Compiled);


стало медленнее
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Оптимизация регулярок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]