Как перечислить все проверенные ключевые слова из предложения?

Это то, что я сделал.

List<string> keywords1 = new List<string> { "word1", "word2", "word3" };

string sentence = Console.ReadLine();

int sentenceLength = sentence.Length;

string pattern = String.Join("|", keywords1.Select(k => Regex.Escape(k)));
Match matching = Regex.Match(sentence, pattern, RegexOptions.IgnoreCase);

if (matching.Success)
{
    Console.WriteLine(matching);  
}
else {
    Console.WriteLine("Keyword not found!");
}

но если в предложении есть соответствие каждому ключевому слову, я хочу перечислить их все. С приведенным выше кодом консоль просто записывает первое совпадающее слово.

Должен ли я использовать foreach? Но как?

Например:
ключевое слово = {"хочу", "купить", "буду", "продам"};
предложение = "Я хочу купить еды".

Тогда результат:
хочу, покупаю


person REY    schedule 12.04.2016    source источник


Ответы (2)


Мне кажется, что это было бы проще всего:

var keyword = new [] {"want", "buy", "will", "sell"};
var sentence = "I want to buy some food." ;

var matches = keyword.Where(k => sentence.Contains(k));

Console.WriteLine(String.Join(", ", matches));

Это приводит к:

want, buy

Или более надежная версия:

var matches = Regex.Split(sentence, "\\b").Intersect(keyword);

Это по-прежнему производит тот же вывод, но избегает сопоставления слов "swill" или "seller", если они встречаются в sentence.

person Enigmativity    schedule 12.04.2016
comment
что он показал, когда нет подходящего слова? я не могу сосчитать слово с помощью int count =match.Split().Length; когда нет подходящего слова, он всегда считается 1 - person REY; 12.04.2016
comment
@REY - если совпадений нет, будет показана пустая строка. Я не знаю, как int count = matches.Split().Length; относится к моему коду. Он не скомпилируется ни с одним из моих определений matches. - person Enigmativity; 12.04.2016
comment
я просто использую другое регулярное выражение, чтобы найти только буквенно-цифровые, и он работает нормально. кажется, что ваш код вводит что-то, что обнаруживает split().length, поэтому он всегда считает 1, когда он пуст - person REY; 13.04.2016
comment
@REY - Хотел бы я понять, что вы только что написали. Как вы думаете, вы могли бы опубликовать свой код? Это может прояснить для меня. - person Enigmativity; 13.04.2016
comment
Извините. это код, который я использую сейчас. int count = Regex.Matches(matches, @[A-Za-z0-9]+).Count;......... теперь мне нужно сделать API для этого проекта, но я не знаю как. , у вас случайно нет ссылки, чтобы узнать API, URL-адрес параметра и подобное поле? - person REY; 13.04.2016
comment
@REY - я до сих пор не понимаю, как int count = Regex.Matches(matches, @"[A-Za-z0-9]+").Count; относится к моему коду. Что касается изучения API - это ужасно широко. Лучше всего выполнить поиск в Google и посмотреть, что вы можете найти. - person Enigmativity; 13.04.2016
comment
нет, я добавил функцию, которая показывает, сколько слов совпадает. Так что это не связано с вашим кодом выше. Я просто запутался, когда я использую .length для пустых совпадений, это считается за 1 слово. поэтому я попытался использовать регулярное выражение, и это сработало. - person REY; 13.04.2016

Из вопроса я предполагаю, что вы ищете сценарий, в котором вы хотите найти входной текст (sentence) для всех элементов в списке (keywords1), если это так, следующий фрагмент поможет вам выполнить задачу

List<string> keywords1 = new List<string>() { "word1", "word2", "word3", "word4" };
string sentence = Console.ReadLine(); //Let this be "I have word1, searching for word3"
Console.WriteLine("Matching words:");
bool isFound = false;
foreach (string word in keywords1.Where(x => sentence.IndexOf(x, StringComparison.OrdinalIgnoreCase) >= 0))
{
    Console.WriteLine(word);
    isFound = true;
}      
if(!isFound)
    Console.WriteLine("No Result");

Пример вывода:

input  : "I have word1, searching for word3"
output : Matching words:
word1
word3
person sujith karivelil    schedule 12.04.2016