как извлечь целое предложение по совпадению одного слова в строке?

Итак, у меня есть целая строка (около 10 тыс. символов), а затем я ищу слово (или несколько слов) в этой строке. С regex(word).Matches(scrappedstring).

Но как это сделать, чтобы извлечь все предложение, содержащее это слово. Я думал взять подстроку после искомого слова до первой точки/восклицательного знака/вопросительного знака/и т.д. Но как взять часть предложения перед искомым словом?

Или, может быть, есть лучшая логика?


person Milkncookiez    schedule 13.05.2013    source источник


Ответы (5)


Если ваши границы, например. ., !, ? и ; соответствуют всем предложениям в выражении [^.!?;]*(wordmatch)[^.!?;]*. Он выдаст все предложения с нужным словным соответствием внутри.

Пример:

var s = "First sentence. Second with wordmatch ? Third one; The last wordmatch, EOM!";
var r = new Regex("[^.!?;]*(wordmatch)[^.!?;]*");
var m = r.Matches(s);

var result = Enumerable.Range(0, m.Count).Select(index => m[index].Value).ToList();
person jwaliszko    schedule 13.05.2013
comment
Я использовал некоторые из ваших предложений здесь, а также выбранный ответ отсюда /вопросы/5767605/ - person Milkncookiez; 13.05.2013

Вы можете получить подстроки между завершающими предложениями (точка/восклицательный знак/вопросительный знак/и т. д.) и искать слово в каждом предложении внутри цикла.

Затем верните подстроку, когда найдете подходящее слово.

person Guven Salgun    schedule 13.05.2013

Когда у вас есть позиция, вы должны читать до следующего . или конца файла... но вам также нужно читать назад от начала слова до . или начала файл. Эти две позиции означают, что вы можете извлечь предложение.

Обратите внимание, что это не защита от дурака ... в своей простейшей форме, как указано выше, e.g. будет означать, что предложение начинается после g., что, вероятно, не так.

person Moo-Juice    schedule 13.05.2013

Извлеките предложения из ввода. Затем найдите указанное слово (слова) в каждом предложении. Верните предложения, в которых присутствует слово (слова).

    public List<string> GetMatchedString(string match, string input)
    {
        var sentanceList = input.Split(new char[] { '.', '?', '!' });
        var regex = new Regex(match);
        return sentanceList.Where(sentance => regex.Matches(sentance,0).Count > 0).ToList();
    }
person cvraman    schedule 13.05.2013

Вы можете сделать это, используя процесс в 2 шага.

Сначала вы фрагментируете фразы, а затем фильтруете каждую, в которой есть слово.

что-то вроде этого:

var input = "A large text with many sentences. Many chars in a string!. A sentence without the pattern word.";

//Step 1: fragment phrase.
var patternPhrase = @"(?<=(^|[.!?]\s*))[^ .!?][^.!?]+[.!?]";

//Step 2: filter out only the phrases containing the word.
var patternWord = @"many";

var result = Regex
    .Matches(input, patternPhrase) // step 1
    .Cast<Match>()
    .Select(s => s.Value)
    .Where(w => Regex.IsMatch(w, patternWord, RegexOptions.IgnoreCase)); // step 2

foreach (var item in result)
{
    //do something with any phrase.
}
person Jonny Piazzi    schedule 13.05.2013