从.Contains()语句中只获取整个单词

时间:2015-06-26 12:57:39

标签: c# .net contains

我使用.Contains()查找一个句子是否包含一个特定的单词但是我发现了一些奇怪的东西:

我想知道句子中是否出现“hi”这个词如下:

  

孩子想玩泥巴

     

你好

     赫克托尔有一个髋关节问题

if(sentence.contains("hi"))
{
   //
}

我只希望过滤SECOND句子,但是所有3个句子都被过滤了,因为CHILD里面有一个'hi',而hip中有一个'hi'。我如何使用.Contains()使得只挑出整个单词?

4 个答案:

答案 0 :(得分:13)

尝试使用Regex:

if (Regex.Match(sentence, @"\bhi\b", RegexOptions.IgnoreCase).Success)
{
    //
};

这对我的输入文字很好。

答案 1 :(得分:7)

这是一个正则表达式解决方案:

正则表达式使用\ b

Word Boundary Anchor

此外,如果搜索字符串可能来自用户输入,您可以考虑使用Regex.Escape转义字符串

此示例应按您希望的方式过滤字符串列表。

string findme = "hi";

string pattern = @"\b" + Regex.Escape(findme) + @"\b";

Regex re = new Regex(pattern,RegexOptions.IgnoreCase);

List<string> data = new List<string> {
"The child wanted to play in the mud",
"Hi there",
"Hector had a hip problem"
};

var filtered = data.Where(d => re.IsMatch(d));

答案 2 :(得分:3)

您可以将句子分成单词 - 您可以在每个空格处分割,然后修剪任何标点符号。然后检查这些单词中是否有任何一个&#39; hi&#39;:

var punctuation = source.Where(Char.IsPunctuation).Distinct().ToArray();
var words = sentence.Split().Select(x => x.Trim(punctuation));
var containsHi = words.Contains("hi", StringComparer.OrdinalIgnoreCase);

在此处查看有效的演示:https://dotnetfiddle.net/AomXWx

答案 3 :(得分:0)

您可以为字符串编写自己的扩展方法,如:

static class StringExtension
        {
            public static bool ContainsWord(this string s, string word)
            {
                string[] ar = s.Split(' ');

                foreach (string str in ar)
                {
                    if (str.ToLower() == word.ToLower())
                        return true;
                }
                return false;
            }
        }