Get only Whole Words from a .Contains() statement

后端 未结 4 515
再見小時候
再見小時候 2020-12-20 15:09

I\'ve used .Contains() to find if a sentence contains a specific word however I found something weird:

I wanted to find if the word "hi" was present in a se

相关标签:
4条回答
  • 2020-12-20 15:53

    You could write your own extension method for string like:

    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;
                }
            }
    
    0 讨论(0)
  • 2020-12-20 15:54

    You could split your sentence into words - you could split at each space and then trim any punctuation. Then check if any of these words are 'hi':

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

    See a working demo here: https://dotnetfiddle.net/AomXWx

    0 讨论(0)
  • 2020-12-20 16:03

    Here's a Regex solution:

    Regex has a Word Boundary Anchor using \b

    Also, if the search string might come from user input, you might consider escaping the string using Regex.Escape

    This example should filter a list of strings the way you want.

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

    DotNetFiddle Example

    0 讨论(0)
  • 2020-12-20 16:12

    Try using Regex:

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

    This works just fine for me on your input text.

    0 讨论(0)
提交回复
热议问题