Получить фразу между "." и это имеет конкретное слово - PullRequest
0 голосов
/ 17 января 2019

Допустим, у меня есть следующий текст:

"Когда я рос, мы жили в маленьком домике с полным подвалом". Мама обустроила подвал с ковриком, покрывающим бетонный пол, а также диваном и креслом, на котором мы могли бы поиграть. и именно там мы хранили большую часть наших игрушек и вещи, которые ценили.

Мы много раз поднимались и спускались по этой деревянной лестнице, и через некоторое время они стали выглядеть довольно потертыми и потрепанными. Мама решила, что собирается их покрасить. Это было за несколько дней до появления быстросохнущих красок, и для полного высыхания краски потребовался целый день. «

Мне нужно регулярное выражение с началом и концом, разделенным знаком "." и это содержит два конкретных слова (пример -> подвал), результат будет:

«Мама обустроила подвал с помощью коврика, покрывающего бетонный пол, дивана и кресла, на котором мы могли бы поиграть».

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вот несколько надежное решение.Он обрабатывает периоды (т.е. полные остановки), но не «точки» (например, «8:00 утра» или «например»).

void Main()
{
    var s = 

    @"When I was growing up, we lived in a little house with a full basement. Mom made the basement cozy with a rug covering the concrete floor and a couch and chair that we could play on. , and that was where we kept most of our toys and the things we treasured.

    We went up and down those wooden stairs many times, and after a while they began to look pretty scuffed and scruffy. Mom decided she was going to paint them. That was in the days before quick-drying paints came into use, and it would take a full day for the paint to dry.";

    Console.WriteLine(Foo(s, "the", "basement"));

}

IEnumerable<string> Foo(string s, params string[] words)
{
    var regexes = from w in words select new Regex(w, RegexOptions.IgnoreCase);

    var xs = new Stack<List<char>>();
    xs.Push(new List<char>());

    foreach (var c in s)
    {
        xs.Peek().Add(c);

        if(c == '.')
            xs.Push(new List<char>());
    }               

    var candidates = xs.Reverse().Select (x => new string(x.ToArray()) );

    foreach (var candidate in candidates)
        if(regexes.All(x => x.IsMatch(candidate)))
            yield return candidate;
}
0 голосов
/ 17 января 2019

Вы можете использовать это регулярное выражение,

[A-Z][^.]*the basement[^.]*\.

Пояснение:

[A-Z] - Это регулярное выражение начинается с заглавной буквы, поскольку предложение начинается с заглавной буквы.

[^.]* - после него может следовать ноль или более любых символов, кроме буквальной точки

the basement - сопровождаемый текстом так, как вы хотите, чтобы он был посередине.

[^.]* - далее далее может следовать ноль или более любых символов, кроме буквальной точки

\. - Наконец, заканчивается буквальной точкой

Демо-версия

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