RegEx有助于从字符串中删除干扰词或停止词

时间:2011-07-25 08:25:07

标签: c# regex c#-4.0

我想删除输入标签中的所有噪音标签(字符串) 标签用逗号分隔。如果噪音词是大标签的一部分,它将保留。

这就是我的工作,但没有工作:

string input_string = "This,sure,about,all of our, all, values";
string stopWords = "this|is|about|after|all|also";
stopWords = string.Format(@"\s?\b(?:{0})\b\s?", stopWords);
string tags = Regex.Replace(input_string, stopWords, "", RegexOptions.IgnoreCase); 

这是我想从上面输入的内容:   “,当然,我们所有的,价值观”

这些词语“This”,“about”,“all”将被替换为“”,因为它们是噪音词。 但即使它中有“全部”的噪音词,“我们所有人”仍将保留。 这是因为逗号是标签边界

任何人都可以帮助我吗?

我有一个替代解决方案,将噪音词放入字典,然后搜索输入字符串中的每个单词。但我更喜欢RegEx方法。

3 个答案:

答案 0 :(得分:1)

        var input = "This,sure,about,all of our, all, values";
        var stopWords = new Regex("^(this|is|about|after|all|also)$");
        var result = String.Join(",", input.Split(',').
            Where(x => !stopWords.IsMatch(x.Trim())));

答案 1 :(得分:0)

尝试

stopWords = string.Format(@"(?<=^|,)\s*(?:{0})\s*(?=$|,)", stopWords);

这使用lookbehind (?<=)来确定字符串的前一个或开头,以及前瞻(?=)以确定尾随,。我还删除了边界\b代码,因为它不需要,并用\s?替换您的可选空格\s*以匹配0个或更多空格。

您可以将*更改为?如果你真的意味着最多只有一个空间。

答案 2 :(得分:0)

我不喜欢使用Regex处理任务,因此我将提供替代解决方案,您可以决定是否要使用它。

string[] inputWords = input_string.Split(',');
string tags = "";

foreach(string s in inputWords)
{
   if(!storWords.Contains(s.ToLowerInvariant()))
      tags += s + ",";
}

tags = tags.TrimEnd(',');

//tags = "sure,all of our,values"