6

我有一些字符串:

"rose with ribbon"
"roses in concrete"
"roses on bed"

我必须编写一个程序来查找存在首选单词的字符串

例如:找到“on”所在的字符串,所以我只需要得到“床上的玫瑰”。

我使用了这段代码:

foreach (KeyWord key in cKeyWords)
{
    foreach (string word in userWords)
    {
        if (key.keyWord.IndexOf(word) != -1)
        {
            ckeyList.Add(key);
        }
    }
}

但我得到了所有字符串,因为 IndexOf 在所有字符串中都找到了“on”。

有没有其他解决方案可以在不拆分的情况下在字符串中找到单独的单词?也许可以使用 Linq 或 Regex?但我不擅长使用它们,所以有任何例子会很高兴。

4

5 回答 5

6

使用正则表达式\bon\b应该可以做到。

\b单词边界的正则表达式锚点,因此正则表达式将匹配紧随其后的单词边界,然后on紧跟另一个单词边界。

以下 C# 示例...

字符串[] sArray = 新字符串[]
    {
        “带丝带的玫瑰”,
        “床上的玫瑰”,
        《混凝土中的玫瑰》
    };

正则表达式 re = new Regex("\\bon\\b");
foreach(sArray 中的字符串 s)
{
    Console.Out.WriteLine("{0} 匹配?{1}", s, re.IsMatch(s));

    匹配 m = re.Match(s);
    foreach(m.Groups 中的组 g)
    {
        如果(g.成功)
        {
            Console.Out.WriteLine("在 {0} 位置找到匹配", g.Index);
        }
    }
}

...将生成以下输出:

玫瑰与丝带相配?错误的
床上的玫瑰花?真的
    在位置 6 找到匹配项
混凝土比赛中的玫瑰?错误的
于 2012-09-15T17:45:34.793 回答
1

是的,通过使用正则表达式,您可以在字符串中找到单词。试试看,

string regexPattern;

foreach (KeyWord key in cKeyWords)
{
  foreach (string word in userWords)
  {
    regexPattern = string.Format(@"\b{0}\b", System.Text.RegularExpressions.Regex.Escape(word));
    if (System.Text.RegularExpressions.Regex.IsMatch(key.keyWord, regexPattern))
    {
        ckeyList.Add(key);
    }
  }
}

如果您不想考虑区分大小写,请在字符串上使用 ToLower() 方法。

 foreach (KeyWord key in cKeyWords)
{
  foreach (string word in userWords)
  {
    regexPattern = string.Format(@"\b{0}\b", System.Text.RegularExpressions.Regex.Escape(word.ToLower()));
    if (System.Text.RegularExpressions.Regex.IsMatch(key.keyWord.ToLower(), regexPattern))
    {
        ckeyList.Add(key);
    }
  }
}
于 2012-09-16T07:47:07.693 回答
0

使用正则表达式,阅读这篇文章: http: //www.dotnetperls.com/regex-match

这是另一篇研究正则表达式的好文章:http: //www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial

于 2012-09-15T17:43:13.903 回答
0

问题是您正在搜索在所有字符串中都可以找到的“on”(ribb* on *, c* on *crete)

您应该搜索“ on”。

更好的解决方案是将字符串解析为单词数组并遍历它们。

于 2012-09-15T17:45:26.557 回答
0

简而言之,这就是您可以做的(替换适当的StartsWithEndsWith用于 C# String 类)。

foreach (KeyWord key in cKeyWords)
{
   foreach (string word in userWords)
   {
       if (key.keyWord.IndexOf(" " + word + " ") != -1
          || key.keyWord.StartsWith(word + " ") 
          || key.keyWord.EndsWith(" " + word))
       {
           ckeyList.Add(key);
       }
}
于 2012-09-15T17:47:57.010 回答