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

C# 如何通过字符串中的单个单词匹配提取整个句子?,c#,.net,regex,string,text-segmentation,C#,.net,Regex,String,Text Segmentation,所以我得到了一个完整的字符串(大约10k个字符),然后在该字符串中搜索一个单词(或多个单词)。使用regex(word).Matches(废弃字符串) 但是如何提取包含这个词的整个句子呢。我想在搜索词后面加一个子串,直到第一个点/感叹号/问号/等等。但是如何在搜索词之前加上句子的一部分呢 或者可能有更好的逻辑?您可以在句子结束符(点/感叹号/质点标记等)之间获得子字符串,并在循环中搜索每个句子中的单词 然后在找到匹配的单词时返回子字符串。一旦找到位置,就可以读取到下一个,或文件的结尾。。但是您还

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

但是如何提取包含这个词的整个句子呢。我想在搜索词后面加一个子串,直到第一个点/感叹号/问号/等等。但是如何在搜索词之前加上句子的一部分呢


或者可能有更好的逻辑?

您可以在句子结束符(点/感叹号/质点标记等)之间获得子字符串,并在循环中搜索每个句子中的单词


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

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


注意,这不是傻瓜式的。。。如上文所述,
最简单的形式,例如,
意味着句子在
g.
之后开始,但情况可能并非如此。

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

    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();
    }
public List GetMatchedString(字符串匹配,字符串输入)
{
var sentanceList=input.Split(新字符[]{'.','?','!'});
var regex=新regex(匹配);
返回sentanceList.Where(sentance=>regex.Matches(sentance,0.Count>0.ToList();
}

您可以通过两个步骤使用一个流程来完成

首先,你将短语分割,然后过滤每个短语中的单词

大概是这样的:

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.
}
var input=“一个包含许多句子的大文本。一个字符串中包含许多字符!。一个没有模式词的句子。”;
//第一步:片段短语。

var patternphase=@“(?如果您的边界是例如
,请匹配
[^.!;]*(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();

我在这里使用了你的一些建议,再加上从这里选择的答案