Помощь с Regex

GammaCore

Client
Регистрация
13.02.2021
Сообщения
18
Благодарностей
2
Баллы
3
Прошу помощи с регуляркой.
В строках содержится по несколько предложений. Надо выцеплять те предложения, где есть дефис (точнее пробел, дефис, пробел), а также не содержится конкретное слово, пусть это будет слово "кошка".

Раз два три. Четыре - пять. Шесть, семь.
Раз два - три. Четыре пять. Шесть, семь.
Раз два - три кошка. Четыре пять. Шесть - семь
Раз два - три кошка. Четыре пять-Шесть - семь

Как я понимаю, у меня куски ограничиваются началом строки или точкой, заканчиваются концом строки или точкой.
В искомом куске идёт любая последовательность символов, включающая " - " и исключающая "кошка".

Я наконструировал что-то такое
(|\\. )(([а-яА-ЯёЁ" -])+) - (([а-яА-ЯёЁ" -])+)($|\.)

81570


Но как исключить слово из этой конструкции не понимаю + Не могу понять как исключить начальный пробел из совпадений, которые начинаются с прошлой точки.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
Ночью не очень хорошо воспринимается инфа. Я бы сделал так.

1) Получить строку содержащую (ставим нужную регулярку)
Если в строке несколько предложений, то разбиваем их на строки:
Добавит в список, в качестве разделителя выбираем .{-String.Space-} (или что-то на свое усмотрение)

2) Проверяем новый список на наличии дефиса в предложении.

P.S. т.к. мы точку забрали, надо ее поставить в конце. но есть вариант что будет две. По этому ставим точку и заменой, меняем две на одну. Понимаю, что это костыль, но если это работает, то почему бы и нет.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
Надо выцеплять те предложения, где есть дефис (точнее пробел, дефис, пробел), а также не содержится конкретное слово, пусть это будет слово "кошка".
А зачем именно регулярка? Можно ведь и через C# делать такую проверку.
C#:
string source = "Тут текст для обработки";
// Разбиваем исходный текст на строки
string[] arrText = source.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
Перебираем строки, обрезая начальные и конечные пробелы.
Делаем проверку на дефис и слово исключение
C#:
string skipWord = "кошка ";

string searchWord = " -  ";

// Перебираем значения
foreach (string line in arrText)
{
    string text = string.Empty;

    if(line.Contains(searchWord) && !line.Contains(skipWord))
    {
        // Нашли нужную строку, обрезаем лишние пробелы по краям.
        text = line.Trim();

        // Выполняем нужные действия со строкой или записываем в отдельный список
       // Или обрабатываем регуляркой
    }
}
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B. и GammaCore

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