Как обработать большой массив данных регуляркой?

Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Здравствуйте!

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

Прикрепляю пример.

В переменной dom содержатся теги - ссылки около 10 000.
Задача регулярного выражения: "найти ссылку ведущую на страницы контакты и записать ее в переменную urlContact"

Само регулярное выражение со своей задачей справляется прекрасно.

Вот только как обработать такой большой массив данных без подвисаний?

Поможет ли если данный кубик заменить на блок с C# кодом? Если да, то не могли бы вы помочь с кодом на C#? Или есть другой более лучший способ?

Очень нужна скорость работы шаблона.
 

Вложения

Последнее редактирование:

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 796
Благодарностей
6 025
Баллы
113
Шаблон, который вы приложили не воспроизводит проблему.
Пробовали выполнять кубик в самом ZennoPoster, а не ProjectMaker?
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Шаблон, который вы приложили не воспроизводит проблему.
Пробовали выполнять кубик в самом ZennoPoster, а не ProjectMaker?
Да, забыл в переменную dom вложить данные:-) Исправил, шаблон перезалил. Попробуйте еще раз пожалуйста. В самом ZP так же виснит.
 

Вложения

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Надо изменить регулярку, напр. хотя бы так:
Код:
(?<=<a {0,2}href {0,2}= {0,2}"\/?)[^/].*?(?="[^<]*?(Контакты|КОНТАКТЫ|контакты))
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
22 448
Благодарностей
10 006
Баллы
113
пробелы не нужно экранировать?
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
не обязательно
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Надо изменить регулярку, напр. хотя бы так:
Код:
(?<=<a {0,2}href {0,2}= {0,2}"\/?)[^/].*?(?="[^<]*?(Контакты|КОНТАКТЫ|контакты))
Этот вариант регулярного выражения хуже работает. Он не найдет вот такой вариант:

</li><li class="normal">
<a href="warranty/">
<span class="navigation-item-text">Гарантия</span>
</a>

</li><li class="normal">
<a href="contact-us/">
<span class="navigation-item-bullet">></span>
<span class="navigation-item-text">Контакты</span>
</a>

</li><li class="normal">
<a href="fotogalereya/">
<span class="navigation-item-bullet">></span>
<span class="navigation-item-text">Фотогалерея</span>
</a>
</li>

Вообще саму регулярку переделывать не хотелось бы. Так как она очень хорошо справлялась со своей задачей. Надежда на C# код, с которым возможно эта проблема решится)
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Надежда на C# код
Код:
var dom = project.Variables["dom"].Value;
var result = Regex.Match(dom, @"(?<=<a {0,2}href {0,2}= {0,2}""\/?)[^/].*?(?=""[\w\W]*(Контакты|КОНТАКТЫ|контакты))",
RegexOptions.RightToLeft).Value.ToString();
return result;
 
  • Спасибо
Реакции: Аркадий

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 374
Благодарностей
2 042
Баллы
113
а зачем три одинакговых слова если можно сначала всё снкачала перевести в нижний или верхний регистср
а если так будет КонТакТы кОнТакТы
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Код:
var dom = project.Variables["dom"].Value;
var result = Regex.Match(dom, @"(?<=<a {0,2}href {0,2}= {0,2}""\/?)[^/].*?(?=""[\w\W]*(Контакты|КОНТАКТЫ|контакты))",
RegexOptions.RightToLeft).Value.ToString();
return result;
Проверил на примере перекрепленном в теме вроде работает.

Но вот только странная штука, если содержимое страницы получить предварительно через GET запрос и так же положить в переменную dom, а после обработать указанным C# кодом, то шаблон снова виснет... Почему?

Хотя этот же C# код обрабатывал мой пример без зависаний..
 

Вложения

Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
а зачем три одинакговых слова если можно сначала всё снкачала перевести в нижний или верхний регистср
а если так будет КонТакТы кОнТакТы
Действительно, так и буду делать)
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Ну, проблема та же - медленная регулярка, и её нужно модифицировать.
Пробуйте так, можно без предварительного шага получения всех href
Код:
var dom = project.Variables["dom"].Value;
var result = Regex.Match(dom, @"(?<=<a {0,2}href {0,2}= {0,2}""\/?)[^/].*?(?=""((?!<a {0,2}href).)*?Контакты)",
RegexOptions.IgnoreCase).Value.ToString();
return result;
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Попробую)
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Ну, проблема та же - медленная регулярка, и её нужно модифицировать.
Пробуйте так, можно без предварительного шага получения всех href
Код:
var dom = project.Variables["dom"].Value;
var result = Regex.Match(dom, @"(?<=<a {0,2}href {0,2}= {0,2}""\/?)[^/].*?(?=""((?!<a {0,2}href).)*?Контакты)",
RegexOptions.IgnoreCase).Value.ToString();
return result;
Да, видимо все же придется изменить регулярку. Правда искать будет хуже. Ваш вариант работает, но не справляется с примером выше) Эх..
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Почему не справляется? Там просто нет Контакты
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Почему не справляется? Там просто нет Контакты
Ваш вариант регулярки не найдет ссылку на контакты вот в этом примере:

</li><li class="normal">
<a href="warranty/">
<span class="navigation-item-text">Гарантия</span>
</a>

</li><li class="normal">
<a href="contact-us/">
<span class="navigation-item-bullet">></span>
<span class="navigation-item-text">Контакты</span>
</a>

</li><li class="normal">
<a href="fotogalereya/">
<span class="navigation-item-bullet">></span>
<span class="navigation-item-text">Фотогалерея</span>
</a>
</li>

А мой вариант находит:-)

Я старался сделать регулярку универсальной, чтобы находила ссылку на контакты в любой разметке.
 
Последнее редактирование:

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
А мой вариант находит:-)
А теперь и мой находит и не зависает 8-)
Код:
var dom = project.Variables["dom"].Value;
var result = Regex.Match(dom, @"(?<=<a {0,2}href {0,2}= {0,2}""\/?)[^/].*?(?s:(?=""((?!<a {0,2}href).)*?контакты))",
RegexOptions.IgnoreCase).Value.ToString();
return result;
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Да))) То что нужно!) Проверил на 10 000 сайтах ваш вариант, ни одного зависания)) Огромнейшее спасибо)))))

Вот эту часть правда немного не понял (?s:(?=""((?!<a {0,2}href).)

Особенно ?s: это видимо спицифика C#?
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)