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

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

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

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

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

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

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

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

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

Вложения

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

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 242
Благодарностей
5 848
Баллы
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
Сообщения
19 478
Благодарностей
8 692
Баллы
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 379
Благодарностей
2 039
Баллы
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)