Любой способ найти слово в строке без split

у меня есть несколько строк:

"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? но я не хорошо использовать их, поэтому было бы неплохо иметь какие-либо примеры.

5 ответов


использование regex с \bon\b должны сделать это.

\b является якорем regex для граница слова, так что регулярное выражение будет соответствовать границе слова сразу же за 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

Да, используя регулярное выражение, Вы можете найти слово в строке. Попробуйте С,

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

использовать регулярные выражения, прочитайте эту статью: http://www.dotnetperls.com/regex-match

и вот еще одна хорошая статья для изучения regex: http://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial


проблема в том, что вы ищете "on", который находится во всех строках (ribb* on*, c* on*Крит)

вы должны искать "on".

лучшим решением было бы разбирать строки на массивы слов и перебирать их.


в двух словах, это то, что вы могли бы сделать (заменив соответствующие StartsWith и EndsWith для 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);
       }
}