【问题标题】:How to check a string for words in sequence如何按顺序检查字符串中的单词
【发布时间】:2013-05-02 13:52:47
【问题描述】:

所以我的代码是这样的

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

【问题讨论】:

  • 当您将 order 拆分为 space 分隔符上的块时,您消除了在 order 中查找诸如“大苹果”之类的短语的能力。如果您正在寻找 Regex 的替代方法,您可以保持 order 字符串不变,并在其中搜索子字符串的出现。 msdn.microsoft.com/en-us/library/…

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


【解决方案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
        }
     }

【讨论】:

  • 我看不出这是如何解决问题的 - 行为与 OP 的代码完全一样
【解决方案2】:

如果您正在搜索子字符串,则无需将 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
}

【讨论】:

  • 它会同时检查“大苹果”和“苹果”
  • big apple 将匹配 big apples 因为它是它的子字符串。我已经更新了答案以包含一个匹配整个单词的正则表达式版本。
【解决方案3】:
var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b");

var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")");
var q = pattern.IsMatch(myText);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多