从 .Contains() 语句中仅获取整个单词
Get only Whole Words from a .Contains() statement
我已经使用 .Contains() 来查找一个句子是否包含特定单词,但是我发现了一些奇怪的东西:
我想找出“hi”这个词是否出现在如下句子中:
The child wanted to play in the mud
Hi there
Hector had a hip problem
if(sentence.contains("hi"))
{
//
}
我只想过滤第二个句子,但是所有 3 个句子都被过滤了,因为 CHILD 中有一个 'hi',而 hip 中有一个 'hi'。我如何使用 .Contains() 以便只挑选出整个单词?
您可以将句子拆分为单词 - 您可以在每个 space 处拆分,然后在 trim 处拆分任何标点符号。然后检查这些词是否是 '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);
在此处查看工作演示:https://dotnetfiddle.net/AomXWx
尝试使用正则表达式:
if (Regex.Match(sentence, @"\bhi\b", RegexOptions.IgnoreCase).Success)
{
//
};
你的输入文本对我来说效果很好。
这是一个正则表达式解决方案:
正则表达式有一个 Word Boundary Anchor 使用 \b
此外,如果搜索字符串可能来自用户输入,您可以考虑使用 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));
您可以为字符串编写自己的扩展方法,例如:
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;
}
}
我已经使用 .Contains() 来查找一个句子是否包含特定单词,但是我发现了一些奇怪的东西:
我想找出“hi”这个词是否出现在如下句子中:
The child wanted to play in the mud
Hi there
Hector had a hip problem
if(sentence.contains("hi"))
{
//
}
我只想过滤第二个句子,但是所有 3 个句子都被过滤了,因为 CHILD 中有一个 'hi',而 hip 中有一个 'hi'。我如何使用 .Contains() 以便只挑选出整个单词?
您可以将句子拆分为单词 - 您可以在每个 space 处拆分,然后在 trim 处拆分任何标点符号。然后检查这些词是否是 '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);
在此处查看工作演示:https://dotnetfiddle.net/AomXWx
尝试使用正则表达式:
if (Regex.Match(sentence, @"\bhi\b", RegexOptions.IgnoreCase).Success)
{
//
};
你的输入文本对我来说效果很好。
这是一个正则表达式解决方案:
正则表达式有一个 Word Boundary Anchor 使用 \b
此外,如果搜索字符串可能来自用户输入,您可以考虑使用 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));
您可以为字符串编写自己的扩展方法,例如:
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;
}
}