Удалить строку в списке по маске[C#]

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
Есть список с такими строками
C#:
https://www.site.ru/catalog/tovar/kantstovar
https://www.site.ru/catalog/tovar/tv
https://www.site.ru/catalog/tovar
https://www.site.ru/catalog/tovar/shoes
Необходимо удалить строку без подкатегорий, здесь это
C#:
https://www.site.ru/catalog/tovar
а остальные сохраняются.
Подскажите, как это сделать правильно.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 458
Благодарностей
8 682
Баллы
113
Вот так попробуйте:

76761


76762


PS: C#-код, думаю сможете найти на просторах форума и использовать в нем регулярку со скриншота.
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
Я сделал так - если слово tovar не закрыто "/"
C#:
                for (int f = 0; f < list.Count; f++)
                    if(!list[f].Contains("tovar/")) list.RemoveAt(f);
то удаляем строку.
Но хотелось бы универсальное что-то.
Например, считать количество "/" в каждой строке и где "/" меньше - ту строку удалить.
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 384
Баллы
113
C#:
var list = new List<string>(){
    "https://www.site.ru/catalog/tovar/kantstovar",
    "https://www.site.ru/catalog/tovar/tv",
    "https://www.site.ru/catalog/tovar",
    "https://www.site.ru/catalog/tovar/shoes"};
for(int i = 0; i < list.Count; i++)
    if(list[i].Split('/').Count() == 5)
        list.Remove(list[i]);
return string.Join(Environment.NewLine, list);
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
C#:
var list = new List<string>(){
    "https://www.site.ru/catalog/tovar/kantstovar",
    "https://www.site.ru/catalog/tovar/tv",
    "https://www.site.ru/catalog/tovar",
    "https://www.site.ru/catalog/tovar/shoes"};
for(int i = 0; i < list.Count; i++)
    if(list[i].Split('/').Count() == 5)
        list.Remove(list[i]);
return string.Join(Environment.NewLine, list);
Хорошо. Осталось добавить в коде подсчёт в каждой строке '/'.
Потому что бывают строки с разной степенью вложенности и '/' может быть и 4 и 6 и больше.
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 384
Баллы
113
C#:
var list = new List<string>(){
    "https://www.site.ru/catalog/tovar/kantstovar",
    "https://www.site.ru/catalog/tovar/kantstovar/stick",
    "https://www.site.ru/catalog/tovar/kantstovar/pencil",
    "https://www.site.ru/catalog/tovar/tv",
    "https://www.site.ru/catalog/tovar",
    "https://www.site.ru/catalog/tovar/shoes/adidas",
    "https://www.site.ru/catalog/tovar/video/",
    "https://www.site.ru/catalog/tovar/video/trailer"};
list.Sort();
for(int i = 0; i < list.Count; i++){
    if(i + 1 < list.Count)
        if(list[i + 1].Contains(list[i])){
            list.Remove(list[i]);
            i--;
        }
}
return string.Join(Environment.NewLine, list);
Так универсально будет. Недавно была такая же задачка, когда магаз тянул. Долго искал тот код, чтобы скопировать, но так и не нашел, а тут и писать-то нечего.
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
А я такое придумал
C#:
int count = 0;
string source = "https://www.site.ru/catalog/tovar/video/trailer";
foreach (char c in source)
{
  if (c == '/') count++;
  source = Regex.Replace(source, "[(/)]", "");//удалить всё, кроме /
}
return source.Length;
Только на регулярке застрял, не работает эта.
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
C#:
var list = new List<string>(){
    "https://www.site.ru/catalog/tovar/kantstovar",
    "https://www.site.ru/catalog/tovar/kantstovar/stick",
    "https://www.site.ru/catalog/tovar/kantstovar/pencil",
    "https://www.site.ru/catalog/tovar/tv",
    "https://www.site.ru/catalog/tovar",
    "https://www.site.ru/catalog/tovar/shoes/adidas",
    "https://www.site.ru/catalog/tovar/video/",
    "https://www.site.ru/catalog/tovar/video/trailer"};

int cat = 5;

var result = list.Where(x => x.Split('/').Length > cat);
project.SendInfoToLog(r.Count().ToString());
 

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
C#:
var list = new List<string>(){
    "https://www.site.ru/catalog/tovar/kantstovar",
    "https://www.site.ru/catalog/tovar/kantstovar/stick",
    "https://www.site.ru/catalog/tovar/kantstovar/pencil",
    "https://www.site.ru/catalog/tovar/tv",
    "https://www.site.ru/catalog/tovar",
    "https://www.site.ru/catalog/tovar/shoes/adidas",
    "https://www.site.ru/catalog/tovar/video/",
    "https://www.site.ru/catalog/tovar/video/trailer"};

int cat = 5;

var result = list.Where(x => x.Split('/').Length > cat);
project.SendInfoToLog(r.Count().ToString());
Все так. Но надо сначала вычислить int cat, а потом сравнить это значение с количеством слешей в каждой строке и удалить строку с наименьшим количеством /.
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 384
Баллы
113
C#:
var list = new List<string>(){
    "https://www.site.ru/catalog/tovar/kantstovar",
    "https://www.site.ru/catalog/tovar/kantstovar/stick",
    "https://www.site.ru/catalog/tovar/kantstovar/pencil",
    "https://www.site.ru/catalog/tovar/tv",
    "https://www.site.ru/catalog/tovar",
    "https://www.site.ru/catalog/tovar/shoes/adidas",
    "https://www.site.ru/catalog/tovar/video/",
    "https://www.site.ru/catalog/tovar/video/trailer"};

int cat = 5;

var result = list.Where(x => x.Split('/').Length > cat);
project.SendInfoToLog(r.Count().ToString());
Это решение зависит от заданного количества слешей и на следующем примере отработает уже не так, как ожидается
1620335447392.png
А мое универсальное
C#:
list.Sort();
for(int i = 0; i < list.Count; i++)
    if(i + 1 < list.Count)
        if(list[i + 1].Contains(list[i])){
            list.Remove(list[i]);
            i--;
        }
1620335626177.png
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Все так. Но надо сначала вычислить int cat, а потом сравнить это значение с количеством слешей в каждой строке и удалить строку с наименьшим количеством /.
После /tovar/* должна быть вложенность, а /tovar/* может быть не четвертым? не совсем понятно что считать
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 458
Благодарностей
8 682
Баллы
113
@soprano А чем все же не подходит метод поиска и удаления по рег-выражению, например такому: /tovar(/|)$
Код можно здесь взять и модернизирвоать его под удаление.
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 384
Баллы
113
@soprano А чем все же не подходит метод поиска и удаления по рег-выражению, например такому: /tovar(/|)$
Код можно здесь взять и модернизирвоать его под удаление.
1620337216165.png
может, потому что результат такой же, как и с подсчетом слешей..
 

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
После /tovar/* должна быть вложенность, а /tovar/* может быть не четвертым? не совсем понятно что считать
Да, удаляется строка с наименьшим количеством слешей. Т.е., такая /tovar
 

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
C#:
var list = new List<string>()
{
    "https://www.site.ru/catalog/tovar/kantstovar",        //хорошо
    "https://www.site.ru/catalog/tovar/kantstovar/stick",  //хорошо
    "https://www.site.ru/catalog/tovar/kantstovar/pencil", //хорошо
    "https://www.site.ru/catalog/tovar/tv",
    "https://www.site.ru/catalog/tovar/", //плохо
    "https://www.site.ru/catalog/tovar",  //плохо
    "https://www.site.ru/catalog/",       //плохо
    "https://www.site.ru/catalog"         //плохо
    
};

var result = list.Where(x => x.Split('/').Length > 5) .Where(x => !string.IsNullOrEmpty(x.Split('/')[5].Trim())).ToList();
foreach(string l in result)
{
    project.SendInfoToLog(l);
}
В первом переборе отбирает все ссылки больше 5 вложений. Второй перебор отбирает все ссылки с непустым шестым вложением
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
В первом переборе отбирает все ссылки больше 5 вложений. Второй перебор отбирает все ссылки с непустым шестым вложением
Вложений может быть разное количество - 4, 5, 6,...
Нужно подсчитать количество слешей в каждой строке, и удалить строку, где их меньше всего.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Вложений может быть разное количество - 4, 5, 6,...
Нужно подсчитать количество слешей в каждой строке, и удалить строку, где их меньше всего.
выше код делает это
 

soprano

Client
Регистрация
25.08.2011
Сообщения
796
Благодарностей
842
Баллы
93
выше код делает это
Цифры типа 5

var result = list.Where(x => x.Split('/').Length > 5) .Where(x => !string.IsNullOrEmpty(x.Split('/')[5].Trim())).ToList();

должны вычисляться. Количество слешей может быть любым. Вручную их считать нецелесообразно.
 

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