Поиск-замена в списке

  • Автор темы Автор темы Dimionix
  • Дата начала Дата начала

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Реакции
3 140
Баллы
113
Добрый день!

Подскажите, пожалуйста, как осуществить поиск-замену в списке, в том числе по регулярному выражению?
Или хотя бы, как добавить какое-то определенное выражение (фразу) в начало каждой строки списка? Количество строк всегда рандомное!
 
Последнее редактирование:
Вот с регуляркой
C#:
Развернуть Свернуть Копировать
// получаем список, в котором будем искать
var sourceList = project.Lists["Spisok"];

var parserRegex = new Regex("\\d{1,2}"); // Вот регулярка на поиск чисел

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (parserRegex.IsMatch(sourceList[i])) // Если регулярка срабатывает, то..
        {
            sourceList[i]="1"; // Заменяем текущий элемент на цифру 1
        }
    }
}
Вот без регулярки. Простой поиск на вхождение текста и его замену
C#:
Развернуть Свернуть Копировать
// получаем список, в котором будем искать
var sourceList = project.Lists["Spisok"];
var poisk = "2";

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (sourceList[i]==poisk)
        {
            sourceList[i]="1";
           
        }
    }
}
 

Вложения

Вот с регуляркой
C#:
Развернуть Свернуть Копировать
// получаем список, в котором будем искать
var sourceList = project.Lists["Spisok"];

var parserRegex = new Regex("\\d{1,2}"); // Вот регулярка на поиск чисел

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (parserRegex.IsMatch(sourceList[i])) // Если регулярка срабатывает, то..
        {
            sourceList[i]="1"; // Заменяем текущий элемент на цифру 1
        }
    }
}
Вот без регулярки. Простой поиск на вхождение текста и его замену
C#:
Развернуть Свернуть Копировать
// получаем список, в котором будем искать
var sourceList = project.Lists["Spisok"];
var poisk = "2";

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (sourceList[i]==poisk)
        {
            sourceList[i]="1";
          
        }
    }
}

Radzhab, спасибо большое!
Но, почему-то простой поиск не срабатывает.
Что добавить в код, чтоб и в самом файле данные перезаписывались сразу после замены, как, например, при обработке стандартным экшеном "Удалить дубли".
 
Они в принципе итак перезаписываются сразу после замены) по поводу работоспособности - Список есть? Данные есть в нем?
 
Они в принципе итак перезаписываются сразу после замены)
Сейчас перезапись в самом файле идет только после, например, того же экшена "Удалить дубли", т.е. не "на лету".
по поводу работоспособности - Список есть? Данные есть в нем?
Да, конечно! И поиск-замена по регулярке работает.
 
Сейчас перезапись в самом файле идет только после, например, того же экшена "Удалить дубли", т.е. не "на лету".
На лету никогда ничего и не меняется. Данные на диске обычно обновляются через несколько секунд.
Все действия производятся в оперативке
 
На лету никогда ничего и не меняется. Данные на диске обычно обновляются через несколько секунд.
Все действия производятся в оперативке
Это понятно, что обновление происходит через несколько секунд.
Я имел ввиду, что в файле вообще ничего не меняется, меняется только в списке привязанном к файлу. Но если после этого, со списком произвести еще какую-то операцию (например, "Удалить дубли"), то файл перезаписывается.
И вот вопрос, что нужно добавить в код, чтоб перезапись осуществлялась сразу после работы сниппета "поиск-замена", без дополнительных экшенов?
 
"сразу" это не работает. изменения пишутся в память.
без дополнительны экшенов должно быть.
прикладывайте готовый пример если не обновляется содержимое файла после изменения данны, посмотрю.
 
Почему не работает такой код

Код:
Развернуть Свернуть Копировать
// получаем список, в котором будем искать
var sourceList = project.Lists["Spisok"];

var parserRegex = new Regex("<.*?>"); // Вот регулярка на поиск чисел

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (parserRegex.IsMatch(sourceList[i])) // Если регулярка срабатывает, то..
        {
            sourceList[i]="1"; // Заменяем текущий элемент на цифру 1
        }
    }
}

Пробую удалить все HTML из списка, а вместо этого список остается пустым...
Пример списка...
  1. <b>Ревизорро</b> возвращается! Новый сезон социальной справедливости возглавит неповторимая Настасья Самбурская.
  2. <b>Ревизорро</b>, У меня есть пожелание к вам. Следующий сезон "<b>Ревизорро</b>" (если он конечно будет т. к рейтинги низкие) сделайте перезагрузкой.
  3. Бары, рестораны, отели… До приезда Лены Летучей все они кажутся приличными. Но внезапные проверки выведут всех на чистую воду! Язык: RU.
Помогите пожалуйста!!!
 
C#:
Развернуть Свернуть Копировать
IZennoList list = project.Lists["Spisok"];
lock (SyncObjects.ListSyncer) {
    for (int i = 0; i < list.Count; i++)
        list[i] = Regex.Replace(list[i], "<.*?>", "");
}
Спасибо! Ускорил работу в разы без цикла в зп
 
  • Оценить
Реакции: Dimionix
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
Развернуть Свернуть Копировать
red &amp; white
red &amp; black
black &amp; yellow
возможно ли заменить &amp; на &, чтобы вышло так:
Код:
Развернуть Свернуть Копировать
red & white
red & black
black & yellow
 
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
Развернуть Свернуть Копировать
red &amp; white
red &amp; black
black &amp; yellow
возможно ли заменить &amp; на &, чтобы вышло так:
Код:
Развернуть Свернуть Копировать
red & white
red & black
black & yellow
http://zennolab.com/wiki/ru:actions:text

Обработка текста -> Замена.
Это базовые и самые простые вещи.
 
  • Оценить
Реакции: xopek2007
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
Развернуть Свернуть Копировать
red &amp; white
red &amp; black
black &amp; yellow
возможно ли заменить &amp; на &, чтобы вышло так:
Код:
Развернуть Свернуть Копировать
red & white
red & black
black & yellow

С помощью Конструктора регулярок создаем регулярку:

upload_2018-3-21_16-30-25.png

Производим замену, если не через снипет, то так:

upload_2018-3-21_16-32-43.png
 
  • Оценить
Реакции: xopek2007
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
Развернуть Свернуть Копировать
red &amp; white
red &amp; black
black &amp; yellow
возможно ли заменить &amp; на &, чтобы вышло так:
Код:
Развернуть Свернуть Копировать
red & white
red & black
black & yellow
HttpUtility.HtmlDecode("red &amp; white");
 
Не работает:

IZennoList list = project.Lists["Список"];
lock (SyncObjects.ListSyncer) {
for (int i = 0; i < list.Count; i++)
list = Regex.Replace(list, "D:\\Папка", "Бла-бла");
}
 
Черт... ввожу здесь на форуме символ \ а он заменяется на |
Он не заменяется, просто курсив наклоняет слеш вправо..
А вообще, на будущее, для постинга кода на форум лучше пользоваться специальным инструментом:
upload_2018-7-17_1-28-57.png
 
Он не заменяется, просто курсив наклоняет слеш вправо..
А вообще, на будущее, для постинга кода на форум лучше пользоваться специальным инструментом:
Посмотреть вложение 30865
ОК, спасибо, но код C# так и не работает:

Код:
Развернуть Свернуть Копировать
IZennoList list = project.Lists["Список"];
lock (SyncObjects.ListSyncer) {
for (int i = 0; i < list.Count; i++)
list = Regex.Replace(list, "D:\\Папка", "Бла-бла");
}
 
ОК, спасибо, но код C# так и не работает:

Код:
Развернуть Свернуть Копировать
IZennoList list = project.Lists["Список"];
lock (SyncObjects.ListSyncer) {
for (int i = 0; i < list.Count; i++)
list = Regex.Replace(list, "D:\\Папка", "Бла-бла");
}
Попробуйте так:
Код:
Развернуть Свернуть Копировать
var list = project.Lists["Список"];
string pattern = @"D:\\\\Папка";
string replacement = "Бла-бла";
for (int i = 0; i < list.Count; i++)
    list[i] = Regex.Replace(list[i], pattern, replacement).ToString();
 
Подскажите как заменить значение в списка
"imgur21":"https:///vector.ru/getImage?photoId=00000000000000",
на значение
"imgur21":"https:///vector.ru/getImage?photoId=234234234345345",

где первое значение "imgur21" меняется "imgur22" "imgur23"
 
  • Оценить
Реакции: Radzhab
Вот с регуляркой
C#:
Развернуть Свернуть Копировать
// получаем список, в котором будем искать
var sourceList = project.Lists["Spisok"];

var parserRegex = new Regex("\\d{1,2}"); // Вот регулярка на поиск чисел

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (parserRegex.IsMatch(sourceList[i])) // Если регулярка срабатывает, то..
        {
            sourceList[i]="1"; // Заменяем текущий элемент на цифру 1
        }
    }
}
Отличный код. Однако нюанс: если в заменяемом куске кода есть вопросительный знак ?, то не срабатывает (пробовал и \? и ?)
 
Отличный код. Однако нюанс: если в заменяемом куске кода есть вопросительный знак ?, то не срабатывает (пробовал и \? и ?)
Разобрался. Закидую если вдруг кто-то столкнется:

C#:
Развернуть Свернуть Копировать
IZennoList list = project.Lists["Список"];
lock (SyncObjects.ListSyncer) {
    for (int i = 0; i < list.Count; i++)
        list[i] = Regex.Replace(list[i], @"\?.*", "/"); //в конкретном примере всё что начинается с ? в строке и идет до конца строки заменяю на слэш /
}
 
replace:
Развернуть Свернуть Копировать
var sourceList = project.Lists["A-Source"];

var parserRegex = new Regex("\\d{1,2}"); // Вот регулярка на поиск чисел

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (parserRegex.IsMatch(sourceList[i])) // Если регулярка срабатывает, то..
        {
            sourceList[i]="1"; // Заменяем текущий элемент на цифру 1
        }
    }
}


Примеры данных списка источников:
Собака
Овец
Рыбы
Привет X ABC
Это данные Y-теста

Возможно ли, что если есть совпадение для текста «X» или «Y», то скрипт заменит их в соответствии с X1 и Y1?

Текущий сценарий заменит всю строку определенным текстом здесь sourceList = "1";

Или позвольте мне объяснить ниже то же самое, чего я хочу достичь:

Если есть список
Привет тест
Это тестовые данные
Опять же, это тестовые данные1

Не могли бы вы помочь с помощью сценария C # для просмотра списка, поиска и замены?

данные> 123
данные1> abc
 
Подскажите как сделать замену только по первому вхождению?
C#:
Развернуть Свернуть Копировать
// получаем список, в котором будем искать
var sourceList = project.Lists["Spisok"];
var poisk = "2";

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++) // Пробегаемся по списку
    {
        if (sourceList[i]==poisk)
        {
            sourceList[i]="1";
          
        }
    }
}
 

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