Get only Whole Words from a .Contains() statement

↘锁芯ラ 提交于 2020-01-03 15:35: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 sentence which are as follows:

The child wanted to play in the mud

Hi there

Hector had a hip problem

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

I only want the SECOND sentence to be filtered however all 3 gets filtered since CHILD has a 'hi' in it and hip has a 'hi' in it. How do I use the .Contains() such that only whole words get picked out?


回答1:


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




回答2:


Try using Regex:

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

This works just fine for me on your input text.




回答3:


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




回答4:


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


来源:https://stackoverflow.com/questions/31073799/get-only-whole-words-from-a-contains-statement

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!