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

Dimionix

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

Подскажите, пожалуйста, как осуществить поиск-замену в списке, в том числе по регулярному выражению?
Или хотя бы, как добавить какое-то определенное выражение (фразу) в начало каждой строки списка? Количество строк всегда рандомное!
 
Последнее редактирование:

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113

Dimionix

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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
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";
           
        }
    }
}
 

Вложения

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
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";
          
        }
    }
}
Radzhab, спасибо большое!
Но, почему-то простой поиск не срабатывает.
Что добавить в код, чтоб и в самом файле данные перезаписывались сразу после замены, как, например, при обработке стандартным экшеном "Удалить дубли".
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Они в принципе итак перезаписываются сразу после замены) по поводу работоспособности - Список есть? Данные есть в нем?
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Они в принципе итак перезаписываются сразу после замены)
Сейчас перезапись в самом файле идет только после, например, того же экшена "Удалить дубли", т.е. не "на лету".
по поводу работоспособности - Список есть? Данные есть в нем?
Да, конечно! И поиск-замена по регулярке работает.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Сейчас перезапись в самом файле идет только после, например, того же экшена "Удалить дубли", т.е. не "на лету".
На лету никогда ничего и не меняется. Данные на диске обычно обновляются через несколько секунд.
Все действия производятся в оперативке
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
На лету никогда ничего и не меняется. Данные на диске обычно обновляются через несколько секунд.
Все действия производятся в оперативке
Это понятно, что обновление происходит через несколько секунд.
Я имел ввиду, что в файле вообще ничего не меняется, меняется только в списке привязанном к файлу. Но если после этого, со списком произвести еще какую-то операцию (например, "Удалить дубли"), то файл перезаписывается.
И вот вопрос, что нужно добавить в код, чтоб перезапись осуществлялась сразу после работы сниппета "поиск-замена", без дополнительных экшенов?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
"сразу" это не работает. изменения пишутся в память.
без дополнительны экшенов должно быть.
прикладывайте готовый пример если не обновляется содержимое файла после изменения данны, посмотрю.
 

morfeus

Client
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
28
Почему не работает такой код

Код:
// получаем список, в котором будем искать
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.
Помогите пожалуйста!!!
 

Dimionix

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

morfeus

Client
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
28
  • Спасибо
Реакции: Dimionix

xopek2007

Client
Регистрация
10.05.2013
Сообщения
102
Благодарностей
11
Баллы
18
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
red &amp; white
red &amp; black
black &amp; yellow
возможно ли заменить &amp; на &, чтобы вышло так:
Код:
red & white
red & black
black & yellow
 

evgen_po

Client
Регистрация
27.08.2013
Сообщения
848
Благодарностей
532
Баллы
93
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
red &amp; white
red &amp; black
black &amp; yellow
возможно ли заменить &amp; на &, чтобы вышло так:
Код:
red & white
red & black
black & yellow
http://zennolab.com/wiki/ru:actions:text

Обработка текста -> Замена.
Это базовые и самые простые вещи.
 
  • Спасибо
Реакции: xopek2007

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Добрый день!
Подскажите, пожалуйста, а можно как то произвести замену в самой строке?
У меня текст иногда парсится в таком виде:
Код:
red &amp; white
red &amp; black
black &amp; yellow
возможно ли заменить &amp; на &, чтобы вышло так:
Код:
red & white
red & black
black & yellow
HttpUtility.HtmlDecode("red &amp; white");
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
346
Благодарностей
209
Баллы
43
А как заменять слэши? C# выдаёт ошибку если в поиске есть \
 

doc

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

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
346
Благодарностей
209
Баллы
43
Не работает:

IZennoList list = project.Lists["Список"];
lock (SyncObjects.ListSyncer) {
for (int i = 0; i < list.Count; i++)
list = Regex.Replace(list, "D:\\Папка", "Бла-бла");
}
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
346
Благодарностей
209
Баллы
43
Черт... ввожу здесь на форуме символ \ а он заменяется на |
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
Черт... ввожу здесь на форуме символ \ а он заменяется на |
Он не заменяется, просто курсив наклоняет слеш вправо..
А вообще, на будущее, для постинга кода на форум лучше пользоваться специальным инструментом:
upload_2018-7-17_1-28-57.png
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
346
Благодарностей
209
Баллы
43
Он не заменяется, просто курсив наклоняет слеш вправо..
А вообще, на будущее, для постинга кода на форум лучше пользоваться специальным инструментом:
Посмотреть вложение 30865
ОК, спасибо, но код C# так и не работает:

Код:
IZennoList list = project.Lists["Список"];
lock (SyncObjects.ListSyncer) {
for (int i = 0; i < list.Count; i++)
list = Regex.Replace(list, "D:\\Папка", "Бла-бла");
}
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
ОК, спасибо, но код 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();
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
346
Благодарностей
209
Баллы
43
Заработало. Только слэшей не 4, а 2 штуки надо было.
 

Иван2019

Новичок
Регистрация
10.12.2019
Сообщения
1
Благодарностей
1
Баллы
3
Подскажите как заменить значение в списка
"imgur21":"https:///vector.ru/getImage?photoId=00000000000000",
на значение
"imgur21":"https:///vector.ru/getImage?photoId=234234234345345",

где первое значение "imgur21" меняется "imgur22" "imgur23"
 
  • Спасибо
Реакции: Radzhab

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Вот с регуляркой
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
        }
    }
}
Отличный код. Однако нюанс: если в заменяемом куске кода есть вопросительный знак ?, то не срабатывает (пробовал и \? и ?)
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Отличный код. Однако нюанс: если в заменяемом куске кода есть вопросительный знак ?, то не срабатывает (пробовал и \? и ?)
Разобрался. Закидую если вдруг кто-то столкнется:

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

zmike

Client
Регистрация
24.10.2019
Сообщения
133
Благодарностей
8
Баллы
18
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
 

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
Подскажите как сделать замену только по первому вхождению?
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";
          
        }
    }
}
 

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