如何按顺序检查字符串中的单词

时间:2013-05-08 10:58:41

标签: c# string string-matching string-search

所以我的代码看起来像这样

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个单词的顺序时,这段代码不起作用,我怎么能在字符串数组时这样做有两个字。我只想知道它是否有"大苹果"我知道我只能这样做"苹果"但我想在订单字符串中找到序列字。

3 个答案:

答案 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
        }
     }