Как перевести регулярки в сниппет?

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
166
Реакции
10
Баллы
18
Доброй ночи! Помогите знатоки в создании сниппета под регулярки. В данный момент все построено на экшенах, но кубиков получается очень много

1. Сниппет

{-Variable.var_listing-} - отсюда парсится через GET-запрос страница
(?<=\?dname=).*?(?=">) - этой регуляркой получаю все заголовки и кладу в список

Таких экшенов повторяется несколько. только регулярки отличаются.

2. Сниппет

В списке удаляются строки, не удовлетворяющие регулярке
 
Доброй ночи! Помогите знатоки в создании сниппета под регулярки. В данный момент все построено на экшенах, но кубиков получается очень много

1. Сниппет

{-Variable.var_listing-} - отсюда парсится через GET-запрос страница
(?<=\?dname=).*?(?=">) - этой регуляркой получаю все заголовки и кладу в список

Таких экшенов повторяется несколько. только регулярки отличаются.

2. Сниппет

В списке удаляются строки, не удовлетворяющие регулярке
Предполагаю, что речь идет об этом
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();

По удалению строк, либо циклом
Код:
Развернуть Свернуть Копировать
string pattern = ""; //regexp pattern
var list = project.Lists["list"];
List<string> resultList = new List<string>();
foreach (string str in list)
{
     if (!Regex.Match(str,pattern).Success)
     {
          continue;
     }
     resultList.Add(str);
}
list.Clear();
list.AddRange(resultList);
либо самое правильно наверное будет это сделать с помощью Lynq'а, чтобы не городить циклы и кучу кода...
 
string match = Regex.Match(project.Variables["Список"].Value, @"(?<=\?dname=).*?(?="">)").ToString();

попробовал сделать так, но выдает ошибку Выполнение действия Csharp OwnCode No Such variable Список
 
string match = Regex.Match(project.Variables["Список"].Value, @"(?<=\?dname=).*?(?="">)").ToString();

попробовал сделать так, но выдает ошибку Выполнение действия Csharp OwnCode No Such variable Список
ну так заведи эту переменную
 
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();

код выполняется, но спарсенные результаты не кладутся в список. Как указать сохранение в список?
 
Сделал вот так
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();
var sourceList = project.Lists["Буффер обмена"];
sourceList.Add(match);

Но у меня в список попадает только первое значение
 
Сделал вот так
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();
var sourceList = project.Lists["Буффер обмена"];
sourceList.Add(match);

Но у меня в список попадает только первое значение
Опиши подробней задачу,сколько значений надо ложить в список?
 
Сделал вот так
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();
var sourceList = project.Lists["Буффер обмена"];
sourceList.Add(match);

Но у меня в список попадает только первое значение

C#:
Развернуть Свернуть Копировать
var parse = project.Variables["var_listing"].Value;
var regex = new Regex(@"(?<=\?dname=).*?(?="">)");
var list = project.Lists["Буффер обмена"];

regex.Matches(parse).Cast<Match>().ToList().ForEach(m=>list.Add(m.Value));
 
  • Спасибо
Реакции: Medvedoc
Если я тебя правильно понял, вот так можно положить все совпадения в список проекта.
Код:
Развернуть Свернуть Копировать
MatchCollection matches = Regex.Matches(project.Variables["var_listing"].Value,@"(?<=\?dname=).*?(?="">)"); //все элементы найденные regexp
lock (SyncObjects.ListSyncer){
var List = project.Lists["совпадения"]; //список с результатом
for(int i=0;i<matches.Count;i++)
{
    List.Add(matches[i].ToString());
}}
 
C#:
Развернуть Свернуть Копировать
var parse = project.Variables["var_listing"].Value;
var regex = new Regex(@"(?<=\?dname=).*?(?="">)");
var list = project.Lists["Буффер обмена"];

regex.Matches(parse).Cast<Match>().ToList().ForEach(m=>list.Add(m.Value));

Ваш вариант идеально подошел =) Спасибо огромное

Только два вопросика:
1. Есть регулярка (?i)(\W|^)(Вариант01|Вариант02|Вариант03|Вариант04|Вариант05)(\W|$)
Надо удалить строки, которые не соответствуют данной регулярке. Как это можно сделать?

2. var list = project.Lists["Буффер обмена"]; - сохраняет в список
А можно сделать сохранение в табицу в определенный столбец?
 
Вообщем попробовал переделать под таблицу. Получилось вышеописанным вариациям также два варианта. Оба сниппета выполняются

Вариант 1

Код:
Развернуть Свернуть Копировать
var parse = project.Variables["var_listing"].Value;
var regex = new Regex(@"(?<=\?dname=).*?(?="">)");
var list = project.Tables["Таблица с параметрами"];
regex.Matches(parse).Cast<Match>().ToList().ForEach(m=>list.SetCell("A", 0, m.Value));

Вариант 2

Код:
Развернуть Свернуть Копировать
MatchCollection matches = Regex.Matches(project.Variables["var_listing"].Value,@"(?<=\?dname=).*?(?="">)"); //все элементы найденные regexp
lock (SyncObjects.ListSyncer){
var List = project.Tables["Таблица с параметрами"]; //список с результатом
for(int i=0;i<matches.Count;i++)
{
    List.SetCell("A", 0, matches[i].ToString());
}}
 
Но В ТАБЛИЦУ ДОБАВЛЯЕТСЯ ТОЛЬКО ПЕРВАЯ СТРОКА
 
  • Спасибо
Реакции: doc
Вот я блин тупанул =))) вместо 0 надо было поставить i
 
Теперь все заработало =0)))
 
а вот с этим так и не разобрался =)

Код:
Развернуть Свернуть Копировать
1. Есть регулярка (?i)(\W|^)(Вариант01|Вариант02|Вариант03|Вариант04|Вариант05)(\W|$)
Надо удалить строки, которые не соответствуют данной регулярке. Как это можно сделать?
 
И тут заметил такой ньюанс
Код:
Развернуть Свернуть Копировать
MatchCollection matches = Regex.Matches(project.Variables["var_listing"].Value,@"(?<=\?dname=).*?(?="">)"); //все элементы найденные regexp
lock (SyncObjects.ListSyncer){
var List = project.Tables["Таблица с параметрами"]; //список с результатом
for(int i=0;i<matches.Count;i++)
{
    List.SetCell("A", i, matches[i].ToString());
}}

Если повторно происходит выполнение сниппета, то данные в таблице просто перезаписываются. Понимаю, что это происходит из-за того что начала цикла начинается с параметра i=0. Как это можно обойти?
 
допиши в своём коде проверку
получай строку в таблице в нужной колонке
проверяй её
если пусто то записывай
если нет ищем пока пустая не появится

количество строк может быть разное
общее кол-во может быть +100500, а в нужном столбце например всего 100
 
я со сниппетами первый день как сегодня знаком =))) если бы знал, написал
 
я со сниппетами первый день как сегодня знаком =))) если бы знал, написал

C#:
Развернуть Свернуть Копировать
var table = project.Tables["Таблица с параметрами"];
var var_listing = project.Variables["var_listing"].Value;

MatchCollection matches = Regex.Matches(var_listing, @"(?<=\?dname=).*?(?="">)"); //все элементы найденные regexp

lock (SyncObjects.ListSyncer)
{
    int rowCount = table.RowCount;
  
    for(int i = 0; i < matches.Count; i++)
    {
        table.SetCell("A", rowCount, matches[i].ToString());
    }
}

если добавлять только в колонку А, то проще так

for(int i = 0; i < matches.Count; i++)
{
table.AddRow(matches.ToString());
}
 
увы не срабатывает =( при повторном моменте добавляет в таблицу только одну строку почему-то
 
ураааааааааааааааа =))) заработало

А
а вот с этим так и не разобрался =)

Код:
Развернуть Свернуть Копировать
1. Есть регулярка (?i)(\W|^)(Вариант01|Вариант02|Вариант03|Вариант04|Вариант05)(\W|$)
Надо удалить строки, которые не соответствуют данной регулярке. Как это можно сделать?

Может и тут подсобите???
 
я так понимаю перед table.SetCell("A", rowCount + i, matches.ToString()); надо сделать проверку matches на не соответствие другой регулярке
 
все равно не пойму. Уже мозг кипит
 
Нашел пример для списка

Код:
Развернуть Свернуть Копировать
var parse = project.Variables["var_listing"].Value;
var regex = new Regex(@"(?<=<td\ class="b-table__cell\ b-table__cell_type_content">).*?(?=</td>)");
var list = project.Lists["Буффер обмена"];
//
regex.Matches(parse).Cast<Match>().ToList().ForEach(m=>list.Add(m.Value));

// получаем список, в котором будем искать
var sourceList = project.Variables["var_listing"].Value;
var parserRegex = new Regex(@"(?i)(\W|^)(Вариант 1|Вариант 2|Вариант 3)(\W|$)"); // Вот регулярка на поиск чисел
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (parserRegex.IsMatch(sourceList[i])) // Если регулярка срабатывает, то..
        {
            return:"no"; // Заменяем текущий элемент на цифру 1
        }
    }
}

Но проверить не могу, так как ругается на вторую строку
 
замени на
var regex = new Regex(@"(?<=<td\ class=""b-table__cell\ b-table__cell_type_content"">).*?(?=</td>)");

P.S. честно я ни хера не пойму твоей задачи, сначала парсишь в один список и его потом вообще не используешь но проверку делаешь с другого
ты уже кинь сюда пример что парсишь, куда пихаешь и что удалить
 
  • Спасибо
Реакции: Medvedoc

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