С# как сохранить в список после Regex?

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
65
Баллы
28
Доброго времени суток всем. Уже много снипетов переделал под C#, тем самым сделав компактными шаблоны. Суть заключается в следующем, нужен снипет для сохранения в список, не по одной строчки, а все вместе. Кубиками есть решения, но нужно убрать из 5 сделать 1. Как у меня сейчас реализовано:
1. Беру DOM
2. Regex на выдергивание ссылок - Сохранение в список
3. Объединить список в переменную
4. Regex ссылок на оставления только доменов - запись в список.
5. Удаление дубликатов.

Как мне эту схему реализовать через С#, потому, что все это я хочу завернуть в цикл for, что бы одним снипетом добавлялось в список ссылки c 10+ страниц.
Нужно что бы после Regex сохранилось это все список, выдернутое из DOM.

И еще вопрос как сделать Regex на C# такого типа:
Код:
(?<=target=_blank\ href=").*?(?="\ data-counter="\[&quot;rc&quot;,&quot;)
? Чем заменить заменить " в самом Regex, что бы выделить начало и конец Regex.
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
271
Баллы
63
Собрать все совпадения по регулярке можно в коллекцию, а потом её обработать
C#:
MatchCollection matches = Regex.Matches(text, @"regexp");
Если одно совпадение, то
C#:
project.Variables["Login"].Value = Regex.Match(text, @"(?<=^).*?(?="":)").Value;
Каждую двойную кавычку надо экранировать ещё одной двойной кавычкой, как показано выше, это если стоит знак "@" перед паттерном регулярки, если не ставить этот знак, то надо экранировать каждый спецсимвол "\"
 

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
65
Баллы
28
Собрать все совпадения по регулярке можно в коллекцию, а потом её обработать
C#:
MatchCollection matches = Regex.Matches(text, @"regexp");
Если одно совпадение, то
C#:
project.Variables["Login"].Value = Regex.Match(text, @"(?<=^).*?(?="":)").Value;
Каждую двойную кавычку надо экранировать ещё одной двойной кавычкой, как показано выше, это если стоит знак "@" перед паттерном регулярки, если не ставить этот знак, то надо экранировать каждый спецсимвол "\"
Т.е через команду List.AddRange()?
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
271
Баллы
63

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
65
Баллы
28
Наврядли, через foreach и List.Add(); точно получится.
string text = response;
project.Lists["Temp"].AddRange(Macros.TextProcessing.Regex(text, @"(?<=target=_blank\ href="").*?(?=""\ data-counter=""\[&quot;rc&quot;,&quot;-)").Select(g => g.FirstOrDefault()));

Вот так получилось. В цикле работает отлично
 

ZSharp

Client
Регистрация
29.09.2013
Сообщения
387
Благодарностей
121
Баллы
43
Подскажите, а как искать по номеру совпадения?
В методе Macros.TextProcessing.Regex можно указать номер совпадения, но если его нет, то он вываливается по ошибке.
А как получить по номеру совпадения, но если его нет, то вернуть пустоту или null, а не ошибку выполнения кода.
 

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
65
Баллы
28
Подскажите, а как искать по номеру совпадения?
В методе Macros.TextProcessing.Regex можно указать номер совпадения, но если его нет, то он вываливается по ошибке.
А как получить по номеру совпадения, но если его нет, то вернуть пустоту или null, а не ошибку выполнения кода.
Для списка
C#:
var check = project.Variables["Search"].Value;
var list = project.Lists["Lists"];
return list.IndexOf(check); // - вернёт номер строки, если она есть, или -1, если строки нет.
Для таблицы
C#:
string table_1ColText1 = "0";//Номер столбика таблицы table_1 с текстовыми значениями для первой фильтрации Текст 1
 
var table_1 = project.Tables["Tables"];//переменная для таблицы table_1
var chekVar1 = project.Variables["Search"].Value;//переменная для сравнения 1
 
int RowCount1 = project.Tables["Tables"].RowCount;//Количество строк в таблице table_1
RowCount1 = RowCount1-1;//Количество строк-1 в таблице table_1
 
 
 
for (int m = 0; m<=RowCount1; m++)
    {
        if (table_1.GetCell(table_1ColText1, m) == chekVar1)
            {
            return m;
            }
    }
 

ZSharp

Client
Регистрация
29.09.2013
Сообщения
387
Благодарностей
121
Баллы
43
Для списка
C#:
var check = project.Variables["Search"].Value;
var list = project.Lists["Lists"];
return list.IndexOf(check); // - вернёт номер строки, если она есть, или -1, если строки нет.
Для таблицы
C#:
string table_1ColText1 = "0";//Номер столбика таблицы table_1 с текстовыми значениями для первой фильтрации Текст 1

var table_1 = project.Tables["Tables"];//переменная для таблицы table_1
var chekVar1 = project.Variables["Search"].Value;//переменная для сравнения 1

int RowCount1 = project.Tables["Tables"].RowCount;//Количество строк в таблице table_1
RowCount1 = RowCount1-1;//Количество строк-1 в таблице table_1



for (int m = 0; m<=RowCount1; m++)
    {
        if (table_1.GetCell(table_1ColText1, m) == chekVar1)
            {
            return m;
            }
    }
А если не список, и не таблица?
Просто нужно взять в переменную 3 элемент.
Я понимаю, что потом можно из списка взять, но возможно ли взять без посредников?
 

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
65
Баллы
28
А если не список, и не таблица?
Просто нужно взять в переменную 3 элемент.
Я понимаю, что потом можно из списка взять, но возможно ли взять без посредников?
Суть не уловил твоего сообщения))
Можешь сделать так и указать в кубики "Возвращать значение"
C#:
// Текст для обработки
string text = project.ExecuteMacro(project.Variables["Search"].Value);
var Search = Macros.TextProcessing.Regex(text, @"Regex", "Номер Совпадения").Count;
if (Search == 0){
    return -1;
}

if (Search == 1){
    // Текст для обработки
return Macros.TextProcessing.Regex(text, @"Regex", "Номер совпадения")[0].FirstOrDefault();}
или так

C#:
// Текст для обработки
string text = project.ExecuteMacro(project.Variables["Search"].Value);
var Search = Macros.TextProcessing.Regex(text, @"Regex", "Номер Совпадения").Count;
if (Search == 0){
    project.Variables["Regex"].Value = -1;
}

if (Search == 1){
    // Текст для обработки
project.Variables["Regex"].Value = Macros.TextProcessing.Regex(text, @"Regex", "Номер совпадения")[0].FirstOrDefault();}
 

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