任何方式在字符串中找到单词而不分割

时间:2012-09-15 17:40:11

标签: c# regex string linq indexof

我有一些字符串:

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

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

E.g: 找到“开”的字符串,所以我只需要“床上的玫瑰”。

我使用了这段代码:

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

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

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

5 个答案:

答案 0 :(得分:6)

使用带\bon\b的正则表达式应该这样做。

\bword boundary的正则表达式锚点,因此正则表达式将匹配紧接着on之后紧跟其他单词边界的单词边界。

以下C#示例......

string[] sArray = new string[]
    {
        "rose with ribbon",
        "roses on bed",
        "roses in concrete"
    };

Regex re = new Regex("\\bon\\b");
foreach (string s in sArray)
{
    Console.Out.WriteLine("{0} match? {1}", s, re.IsMatch(s));

    Match m = re.Match(s);
    foreach(Group g in m.Groups)
    {
        if (g.Success)
        {
            Console.Out.WriteLine("Match found at position {0}", g.Index);
        }
    }
}

...将生成以下输出:

rose with ribbon match? False
roses on bed match? True
    Match found at position 6
roses in concrete match? False

答案 1 :(得分:1)

是的,通过使用Regex,您可以在字符串中找到单词。试试,

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);
    }
  }
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

问题是你正在搜索所有字符串中的“on”( *上的ribb * * crete上的c *

您应该搜索“on”。

更好的解决方案是将字符串解析为单词数组并迭代这些字符串。

答案 4 :(得分:0)

简而言之,这就是你可以做的(用C#String类替换相应的StartsWithEndsWith。)

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);
       }
}