Удалить строку в которой есть НЕ подряд идущие слова

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
414
Благодарностей
155
Баллы
43
Кто может подсказать решение?

Есть строки в списке.
Есть три переменные {-Variable.Slovo_1-} {-Variable.Slovo_2-} {-Variable.Slovo_3-} (в них искомые слова, например: мама, раму, мыла)

Необязательно:
Найти строки желательно с учетом морфологии, или хотя бы чтобы можно было дописать окончания мам(а,е,ы)


1. Вчера вечером мама помыла раму в квартире
2. Вчера вечером раму, мама..... мыла в квартире.
3. Мама вечером раму, мыла в квартире.
4. Вчера вечером мыла, раму мама в квартире
5. Вчера вечером раму в квартире
6. Вчера мамы вечером рамы мыли в квартире.
7. Мыла вчера вечером раму, мама. в квартире.
8. Вчера вечером мыла в квартире.

2. Вчера вечером раму, мама..... мыла в квартире.
3. Мама вечером раму, мыла в квартире.
4. Вчера вечером мыла, раму мама в квартире
7. Мыла вчера вечером раму, мама. в квартире.



Нашел такое решение https://ru.stackoverflow.com/questions/486345/Поиск-всех-слов-в-любом-порядке но там ищет слова которые идут по порядку, внизу темы есть c# код.
 

Oleg-KC

Client
Регистрация
17.02.2020
Сообщения
168
Благодарностей
56
Баллы
28
Так тебе нужно на наличие {-Variable.Slovo_1-} {-Variable.Slovo_2-} {-Variable.Slovo_3-}, т.е. всех трех слов проверять в строках?
У меня нет готового решения, сам пользуюсь вхождением одного слова, но чтоб сразу трех - накидал код (я не спец), только если слово начинается с большой буквы он не видит его.
C#:
// берем из переменной слово 1-2-3, которые надо искать
var Slovo1 = project.Variables["q1"].Value;
var Slovo2 = project.Variables["q2"].Value;
var Slovo3 = project.Variables["q3"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Список 1"];
// получаем список, в который будем писать
var postList = project.Lists["Список 2"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer) // Лок для многопотока
{
     for(int i=0; i < sourceList.Count; i++)
        {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем на содержание слова в строке
        if (str.Contains(Slovo1))
        {
            // если слово найдено, ищем второе слово
            if (str.Contains(Slovo2))
            {
                // и третье
                if (str.Contains(Slovo3))
                {
                    postList.Add(str);
                    sourceList.RemoveAt(i);
                    i--;
                }
            }
        }
    }
}
 
Последнее редактирование:
  • Спасибо
Реакции: fri-lancer

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
414
Благодарностей
155
Баллы
43
Спасибо, щас потестирую.
 

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
414
Благодарностей
155
Баллы
43
только если слово начинается с большой буквы он не видит его.
Это не проблема сделаю в списке все слова в нижний регистр

А можно в этом коде как то сделать чтобы он удалял из первого списка те строки которые подошли под наличие трех слов?
 

Oleg-KC

Client
Регистрация
17.02.2020
Сообщения
168
Благодарностей
56
Баллы
28
C#:
// берем из переменной слово 1-2-3, которые надо искать
var Slovo1 = project.Variables["q1"].Value;
var Slovo2 = project.Variables["q2"].Value;
var Slovo3 = project.Variables["q3"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Список 1"];
// получаем список, в который будем писать
var postList = project.Lists["Список 2"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer) // Лок для многопотока
{
     for(int i=0; i < sourceList.Count; i++)
        {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем на содержание слова в строке
        if (str.Contains(Slovo1))
        {
            // если слово найдено, ищем второе слово
            if (str.Contains(Slovo2))
            {
                // и третье
                if (str.Contains(Slovo3))
                {
                    postList.Add(str);
                    sourceList.RemoveAt(i);
                    i--;
                }
            }
        }
    }
}
Поправил тут, посмотри работает удаление?
 
  • Спасибо
Реакции: fri-lancer

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
414
Благодарностей
155
Баллы
43

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
414
Благодарностей
155
Баллы
43
Кто подскажет как в этом коде сделать чтобы искало точное совпадение слова?
Сейчас например по слову "дом" может найти: роддом, домик, надомный, домоводство и т.д.
 

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
414
Благодарностей
155
Баллы
43

bad robot

Client
Регистрация
07.03.2011
Сообщения
191
Благодарностей
48
Баллы
28
Код:
\bслово\b
попробуй обрамить слова в такую регулярку, \b - это граница слова
 

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
414
Благодарностей
155
Баллы
43
Код:
\bслово\b
попробуй обрамить слова в такую регулярку, \b - это граница слова
не сработало, и сюда вставлял (str.Contains(Slovo1)) вот так (str.Contains(\bSlovo1\b)) - выдает ошибку

Я так понимаю нужно что то типа такого добавить
Regex regex = new Regex("[0-9]+"); - только это для поиска цифр, вот как то так чтоль Regex regex = new Regex("^Slovo1$");

такой вот код нашел
string testString = "John Doe, 42 years";
Regex regex = new Regex("[0-9]+");
if (regex.IsMatch(testString))
Console.WriteLine("String contains numbers!");
else
Console.WriteLine("String does NOT contain numbers!");
 

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