如何通过字符串中的单个单词匹配提取整个句子?

时间:2013-05-13 11:35:29

标签: c# .net regex string text-segmentation

所以我有一个完整的字符串(大约10k字符),然后在该字符串中搜索一个单词(或许多单词)。使用regex(word).Matches(scrappedstring)

但如何提取包含该词的整个句子。我想在搜索到的单词之后取一个子字符串,直到第一个点/感叹号/问号/等。但是如何在搜索到的单词之前取出句子的一部分?

或许有更好的逻辑?

5 个答案:

答案 0 :(得分:2)

如果您的界限是.!?;匹配[^.!?;]*(wordmatch)[^.!?;]*表达式中的所有句子。 它将为所有句子提供所需的 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();

答案 1 :(得分:0)

你可以在句子终结者之间得到子串(点/感叹号/ qustion标记/等),并在循环内的每个句子中搜索单词。

然后在找到匹配的单词时返回子字符串。

答案 2 :(得分:0)

一旦你有一个职位,你就会读到下一个.或文件的结尾..但你还需要从单词的开头读取向后.或文件的开头。这两个位置意味着你可以提取句子。

请注意,这不是万无一失的......如上所述,最简单的形式e.g.意味着句子在g.之后开始,而这可能不是这样。

答案 3 :(得分:0)

从输入中提取句子。然后在每个发送内搜索指定的单词。 返回单词存在的句子。

    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();
    }

答案 4 :(得分:0)

您可以分两个步骤使用一个过程。

首先你将短语分段,然后过滤每个短语。

类似的东西:

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.
}