2016-04-12 59 views
1

這就是我所做的。如何從句子中列出所有檢查的關鍵字?

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嗎?但是如何?

例如:
關鍵字= {「want」,「buy」,「will」,「sell」};
sentence =「我想買點食物。」

那麼結果:
想,買

回答

1

在我看來,這將是最簡單的:

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"我f他們發生在sentence

+0

當沒有匹配的詞時它顯示了什麼?我無法用int count = matches.Split()。長度;當沒有匹配詞時,它始終計數1 – REY

+0

@REY - 如果沒有匹配,它將顯示一個空字符串。我不知道'int count = matches.Split()。Length'如何適用於我的代碼。它不會用我的任何'matches'定義進行編譯。 – Enigmativity

+0

我只是使用另一個正則表達式來查找只有alfanumeric,它工作得很好。 看起來你的代碼輸入了split()。length檢測到的東西,所以它在空的時候總是數爲1 – REY

0

從我假設你正在尋找,你要搜索列表中的所有項目中輸入文本(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 
相關問題