2

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

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

或者也许有更好的逻辑?

4

5 回答 5

2

如果您的边界是例如.、和!,则匹配表达式中的所有句子。它将给出所有带有所需单词匹配的句子。?;[^.!?;]*(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();
于 2013-05-13T12:40:01.310 回答
0

您可以获取句子完成符(点/感叹号/问号/等)之间的子字符串,并在循环内的每个句子中搜索单词。

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

于 2013-05-13T11:40:05.873 回答
0

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

请注意,这不是万无一失的......在上面概述的最简单的形式中,e.g.这意味着句子在 the 之后开始,g.这可能不是这种情况。

于 2013-05-13T11:48:11.020 回答
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();
    }
于 2013-05-13T11:51:20.433 回答
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.
}
于 2013-05-13T11:57:57.077 回答