Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 20.05.2022
Сообщений: 4

Регулярные выражения, поиск нескольких слов в строке

20.05.2022, 14:09. Показов 1184. Ответов 5

Студворк — интернет-сервис помощи студентам
Добрый день!

Общая суть проблемы:
Есть текстовый файл, куда сыпятся логи. Построчно выводим содержимое на консоль. Каждая строка в таком файле рассматривается как отдельно взятая сущность, которую необходимо проверить на наличие нескольких слов и в случае, если хотя бы одно из искомых слов в этой строке будет найдено, то такая строка не должна быть выведена на консоль.
Регистр символов, при анализе строки не учитывается.

Особенности задачи:
Вывод строки на консоль должен быть возможен только при наличии в этой строке слова - "убил"
И отсутствии в ней таких слов как:
- "бот"
- "бота"
В дальнейшем список "запрещенных" будет дополнятся.


Вот часть подобного лог файла, либо во вложении сам файл:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
11:59 [Info] [Death Notes] pykan937 убил бота падальщик 
~ Используя Арбалет 
~ С расстояния в 15.1 m
11:59 [Info] [Death Notes] pykan937 убил бота падальщик 
~ Используя Арбалет 
~ С расстояния в 15.1 m
12:00 [Info] [Death Notes] pykan937 убил бота падальщик 
~ Используя Арбалет 
~ С расстояния в 15 m
12:00 [Info] [Death Notes] pykan937 убил бота падальщик 
~ Используя Арбалет 
~ С расстояния в 16 m
12:29 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Salvaged Cleaver 
~ С расстояния в 0.2 m
12:29 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 0.1 m
12:30 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 14 m
12:31 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 2.9 m
12:32 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 6.1 m
12:33 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 4.3 m
12:34 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 1.4 m
12:34 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 2.7 m
12:34 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 1.8 m
12:35 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Salvaged Cleaver 
~ С расстояния в 0.9 m
12:37 [Info] [Death Notes] pykan937 убил бота блуждающий 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 0.2 m
12:41 [Info] [Welcomer] [Disconnected] player  pykan937(Kicked: Unresponsive)
12:49 [Info] [Welcomer] [Connected] Игрок pykan937 from Russia
12:58 [Info] [Death Notes] pykan937 убил бота Scientist 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 10.7 m
12:59 [Info] [Death Notes] pykan937 убил бота Scientist 
~ Используя Пистолет пулемёт MP5A4 
~ С расстояния в 20.3 m
13:01 [Info] [Death Notes] Arctic Wolf убил -=RaZoR= 
~ Используя Vehicle 
~ С расстояния в 2.9 m
13:03 [Info] [Welcomer] [Disconnected] player  pykan937(Disconnected)
15:00 [Info] Listing 23 plugins:
Мое кривое и избыточное решение, с использованием аж целых трех конструкций IF (ради читабельности условий):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    static void Main(string[] args)
    {
        string path1 = @"C:\Users\user\Downloads\logs\oxide_2021-04-16.txt";
 
        using (StreamReader reader = new StreamReader(path1))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                if (Regex.IsMatch(line, @"\bубил\b", RegexOptions.IgnoreCase))
                    if (!Regex.IsMatch(line, @"\bбот\b", RegexOptions.IgnoreCase))
                        if (!Regex.IsMatch(line, @"\bбота\b", RegexOptions.IgnoreCase))
                            Console.WriteLine(line);
            }
        }
Вывод будет следующим
Code
1
2
3
11:05 [Info] [Death Notes] pykan937 убил ZiP_ MonSteR
11:41 [Info] [Death Notes] pykan937 убил Кабан
13:01 [Info] [Death Notes] Arctic Wolf убил -=RaZoR=
Итог, желаемый результат:

Хотелось бы уместить все в одном регулярном выражении, и как следствие ограничиться одной IF. Без использования циклов по массиву\перечислению на соответствие "запрещенных" слов.
Вложения
Тип файла: txt oxide_2021-04-16.txt (17.5 Кб, 2 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.05.2022, 14:09
Ответы с готовыми решениями:

Посчитать в строке количество слов используя регулярные выражения
Нужно написать программу, используя регулярные выражения

Регулярные выражения: поиск слов заданной длины
Добрый день! Ищу слова по заданной длине с помощью регулярных выражений, но столкнулся с проблемой, что не могу корректно вывести самое...

Регулярные выражения, поиск слова в строке
Есть строка, например "City, Search, Manhattan, New York, California, Date" нужно получить только "New York".

5
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
20.05.2022, 14:11
регулярки это обязательное условие?
0
0 / 0 / 0
Регистрация: 20.05.2022
Сообщений: 4
20.05.2022, 14:20  [ТС]
Альтернативное решение так же будет интересно, однако конечная цель, привести именно к регулярному выражению.
0
0 / 0 / 0
Регистрация: 20.05.2022
Сообщений: 4
02.06.2022, 11:26  [ТС]
Собственно вопрос решался довольно просто, используя логическое "ИЛИ" в регулярном выражении, что я на момент написания кода не знал:

C#
1
2
string pattern = @"адм(\w*) | adm(\w*)";
string pattern2 = @"\bбот\b | \bбота\b | \bмедведь\b | \bкабан\b | \bWolf\b | \bолень\b | \bкурочка\b"; // запрещеные слова
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,549
Записей в блоге: 4
02.06.2022, 14:43
noname9061, Для повышения скорости работы создавайте один раз объекты с регуляркой, а не каждый раз при вызове
C#
1
2
3
4
5
private static readonly string _findSpaces = @"[\s]+";
private static readonly string _findCommas = @"(?<=\d)\,(?=\d)+";
 
private static readonly Regex _regexSpaces = new Regex(_findSpaces, RegexOptions.Compiled);
private static readonly Regex _regexCommas = new Regex(_findCommas, RegexOptions.Compiled);
Использование
C#
1
2
3
4
5
6
7
public static string TrimSpaces(string text)
{
    string newText = _regexSpaces.Replace(text, " ");
    newText = _regexCommas.Replace(newText, ".");
 
    return newText.Trim(' ', '.', ',', ';');
}
0
0 / 0 / 0
Регистрация: 20.05.2022
Сообщений: 4
08.06.2022, 12:22  [ТС]
Возможно не понял рекомендации. Все операции с текстом, включая шаблоны регулярок, пути-расположения файла поместить в отдельный класс, после работать только через объект этого класса, в качестве аргумента передавая текст, и на выхлопе получать результат?
В моем случае, данный функционал будет использоваться в телеграм-боте, где пользователь будет по запросу получать отфильтрованный список лог файла текущего дня.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.06.2022, 12:22
Помогаю со студенческими работами здесь

Регулярные выражения (поиск слов)
Необходимо осуществить поиск слов, которые разделены запятыми или пробелами.(Слова должны содержать только латинские символы , если слово...

Поиск в строке. Регулярные выражения
Доброго времени суток. Подскажите, как с помощью регулярных выражений вывести из строки содержимое скобок через точку с запятой. ...

Задачи на регулярные выражения - поиск количества слов
Слово — это последовательность из букв (русских или английских), внутри которой могут быть дефисы. На вход даётся текст, посчитайте,...

Регулярные выражения: поиск подстрок в строке
есть строка &lt;td class=&quot;alt1&quot;&gt;&lt;a class=&quot;smallfont&quot; href=&quot;forumdisplay.php?f=6&amp;amp;page=501&amp;amp;order=desc&quot; title=&quot;с 8001 по 8016, из...

Регулярные выражения: поиск последовательности символов в строке
Как сделать так, чтобы js возвращал true, если найдет в совершенно любой строке определенную последовательность симоволов. В масках...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru