所以我的代码看起来像这样
string order = "Im sending you big apples x100";
string[] fruits = { "apples", "big apples", "oranges" };
string[] vegetables = { "tomatoes", "carrots", "cucumber" };
string[] words = order.Split();
if (fruits.Any(w => words.Contains(w)))
{
//do things here
}
if (vegetables.Any(w => words.Contains(w)))
{
//do things here
}
我希望能够找到依赖于顺序字符串的确切内容,如果可能的话,现在在我的情况下,当字符串数组有2个单词的顺序时,这段代码不起作用,我怎么能在字符串数组时这样做有两个字。我只想知道它是否有"大苹果"我知道我只能这样做"苹果"但我想在订单字符串中找到序列字。
答案 0 :(得分:7)
如果您要搜索子字符串,则无需将order
字符串拆分为单个字词。您可以使用String.Contains
方法(在这种情况下,将words.Contains
替换为order.Contains
)。
if (fruits.Any(w => order.Contains(w)))
{
//do things here
}
if (vegetables.Any(w => order.Contains(w)))
{
//do things here
}
如果您的搜索可能不区分大小写,则可以使用IndexOf
方法。
if(fruits.Any(w => order.IndexOf(w, StringComparison.OrdinalIgnoreCase) >= 0))
{
//do things here
}
if (vegetables.Any(w => order.IndexOf(w, StringComparison.OrdinalIgnoreCase) >= 0))
{
//do things here
}
根据评论,这将匹配单词的子字符串(例如apple
将匹配apples
)。如果它必须是整个单词,那么你可以使用Govind Kumar的答案中的regex
(看起来已被复制from this answer)。你会这样使用它:
var fruitWords = fruits.Select(w => @"\b" + Regex.Escape(w) + @"\b");
var fPattern = new Regex("(" + string.Join(")|(", fruitWords) + ")");
var fruitMatch = fPattern.IsMatch(order);
var vegWords = fruits.Select(w => @"\b" + Regex.Escape(w) + @"\b");
var vPattern = new Regex("(" + string.Join(")|(", vegWords) + ")");
var vegMatch = vPattern.IsMatch(order);
if(fruitMatch)
{
//fruit matched
}
if(vegMatch)
{
//veg matched
}
答案 1 :(得分:0)
var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b");
var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")");
var q = pattern.IsMatch(myText);
答案 2 :(得分:-1)
这将让您循环浏览每种类型的水果,然后检查值。既然你已经有了一种使用Lambda语法的方法,我想我会分享一个非lambda版本!
foreach (var fruit in fruits)
{
if (order.contains(fruit))
{
//do things here
}
}
foreach (var veg in vegetables)
{
if (order.contains(veg))
{
//do things here
}
}