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

Medvedoc

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

1. Сниппет

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

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

2. Сниппет

В списке удаляются строки, не удовлетворяющие регулярке
 

woober

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

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'а, чтобы не городить циклы и кучу кода...
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
string match = Regex.Match(project.Variables["Список"].Value, @"(?<=\?dname=).*?(?="">)").ToString();

попробовал сделать так, но выдает ошибку Выполнение действия Csharp OwnCode No Such variable Список
 

woober

Client
Регистрация
07.04.2015
Сообщения
211
Благодарностей
123
Баллы
43
string match = Regex.Match(project.Variables["Список"].Value, @"(?<=\?dname=).*?(?="">)").ToString();

попробовал сделать так, но выдает ошибку Выполнение действия Csharp OwnCode No Such variable Список
ну так заведи эту переменную
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();

код выполняется, но спарсенные результаты не кладутся в список. Как указать сохранение в список?
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
Сделал вот так
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();
var sourceList = project.Lists["Буффер обмена"];
sourceList.Add(match);

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

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
469
Благодарностей
198
Баллы
43
Сделал вот так
string match = Regex.Match(project.Variables["var_listing"].Value, @"(?<=\?dname=).*?(?="">)").ToString();
var sourceList = project.Lists["Буффер обмена"];
sourceList.Add(match);

Но у меня в список попадает только первое значение
Опиши подробней задачу,сколько значений надо ложить в список?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Сделал вот так
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

Tsuk15

Client
Регистрация
25.04.2017
Сообщения
102
Благодарностей
40
Баллы
28
Если я тебя правильно понял, вот так можно положить все совпадения в список проекта.
Код:
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());
}}
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
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["Буффер обмена"]; - сохраняет в список
А можно сделать сохранение в табицу в определенный столбец?
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
Вообщем попробовал переделать под таблицу. Получилось вышеописанным вариациям также два варианта. Оба сниппета выполняются

Вариант 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());
}}
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
Но В ТАБЛИЦУ ДОБАВЛЯЕТСЯ ТОЛЬКО ПЕРВАЯ СТРОКА
 

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
824
Баллы
93
  • Спасибо
Реакции: doc

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
Вот я блин тупанул =))) вместо 0 надо было поставить i
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
Теперь все заработало =0)))
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
а вот с этим так и не разобрался =)

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

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
И тут заметил такой ньюанс
Код:
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. Как это можно обойти?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
допиши в своём коде проверку
получай строку в таблице в нужной колонке
проверяй её
если пусто то записывай
если нет ищем пока пустая не появится

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

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
я со сниппетами первый день как сегодня знаком =))) если бы знал, написал
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
я со сниппетами первый день как сегодня знаком =))) если бы знал, написал
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());
}
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
увы не срабатывает =( при повторном моменте добавляет в таблицу только одну строку почему-то
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
  • Спасибо
Реакции: Medvedoc

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
ураааааааааааааааа =))) заработало
А
а вот с этим так и не разобрался =)

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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
я так понимаю перед table.SetCell("A", rowCount + i, matches.ToString()); надо сделать проверку matches на не соответствие другой регулярке
 

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
все равно не пойму. Уже мозг кипит
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

Medvedoc

Client
Регистрация
01.04.2017
Сообщения
164
Благодарностей
10
Баллы
18
Нашел пример для списка

Код:
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
        }
    }
}
Но проверить не могу, так как ругается на вторую строку
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
замени на
var regex = new Regex(@"(?<=<td\ class=""b-table__cell\ b-table__cell_type_content"">).*?(?=</td>)");

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

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