2016-06-29 18 views
0

我有它由一個文本文件:添加通配符正則表達式的短語和文本匹配

  1. 朵朵的單詞(比如manipulat - 從「操縱」梗),並
  2. 朵朵詞組,通常有兩種單詞或更多(例如 「承認他認爲投資」 - 源自「承認他對投資」 )。

每個單詞/短語被呈現在一個新行。我的C#代碼讀取此文本文件中的每一行,然後爲每一行搜索DataTable中的所有行以匹配它們。即,如果一個詞/短語出現在數據表中的任何行,我的系統將標誌該行..

對於單個字,它很容易做/使用算法我有相匹配。如果它們出現在DataTable行中,我可以將「操縱」與「操縱」,「操縱」,「操縱」和「操縱」等詞語相匹配。

但是對於短語,我的算法只能匹配它的內容。在這裏,我的意思是,如果我的短語是「承認他認爲投資」,那麼它將只搜索確切的短語,並且如果在DataTable行中存在「承認他有關投資」,則它將不匹配/標記。

我對Regex和C#都沒有多少知識。我試圖修改下面的代碼來使用通配符,但到目前爲止沒有運氣。如果有人能夠幫助,我將不勝感激。先進的謝謝你。

string[] words = File.ReadAllLines(sourceDirTemp + comboBox_filename.SelectedItem.ToString() + ".txt"); 
     var query = LoadComments().AsEnumerable().Where(r => 
      words.Any(wordOrPhrase => Regex.IsMatch(r.Field<string>("Column_name"), @"\b" 
       + Regex.Escape(wordOrPhrase) + @"\b", RegexOptions.IgnoreCase))); 
+0

如果您可以更改數據庫值,您可以將短語更改爲正則表達式模式,即'承認他認爲投資'變成'承認[a-z] *他認爲[a-z] *投資[a-z] *'。 –

+0

存在一個問題:如果你只是用空格分隔'wordOrPhrase',並且給每個''添加'\ w *',你就可以將'自己'與'him'匹配(這會變成'him \ w *'。你對這個計劃? –

+1

總之,我的建議是'Regex.IsMatch(r.Field ( 「欄」),的string.join( 「+」, \t \t \t wordOrPhrase.Split(),選擇(p => string.Format(@「\ b {0} \ w * \ b」,Regex.Escape(p)))),RegexOptions.IgnoreCase)' –

回答

0

當使用 RegEx你可以在你的代碼擴展你的模式與幹字線條比較從您的數據庫。

這將匹配1個或多個的任何單詞字符的

\w+ 

如Abbodanza已經提到的,這將匹配之間的任何字符這將匹配0或多次出現的任何單詞字符

\w* 

az 0次或多次發生。

[a-z]* 

編輯:

如果你的算法適用於單個的詞,你可以拆分每個短語

string[] words = File.ReadAllLines(sourceDirTemp + comboBox_filename.SelectedItem.ToString(); 
foreach(var word in words) 
{ 
    // moreOrOneWord.Length would allow you to check whether it is a phrase 
    string [] moreOrOneWord = words.Split(' '); 

    var query = LoadComments().AsEnumerable().Where(r => 
      moreOrOneWord.Any(wordOrPhrase => Regex.IsMatch(r.Field<string>("Column_name"), @"\b" 
       + Regex.Escape(wordOrPhrase) + @"\b", RegexOptions.IgnoreCase))); 

    // Do something with the query... 

} 

這應該允許您將算法應用到每一個字的文字。

here你可以找到一個以正則表達式開始的例子。

here是,你可以使用正則表達式元素的列表。

希望這可以幫助

0

如果拆分的wordOrPhrase有空間,並添加\w*匹配0+字母數字或下劃線字符(或多個特定的模式只匹配字母像[\p{L}\p{M}]*)到每個塊,你可以使用

Regex.IsMatch(r.Field<string>("Column_name"), 
    string.Join(" +", wordOrPhrase.Split() 
     .Select(p => string.Format(@"\b{0}\w*\b", Regex.Escape(p)))), 
    RegexOptions.IgnoreCase) 

如果你有acknowledg him regard the investwordOrPhrase,正則表達式將是\backnowledg\w*\b +\bhim\w*\b +\bregard\w*\b +\bthe\w*\b +\binvest\w*\b,並找到一個匹配。請參閱this IDEONE demo

但是,使用這種方法,himself將與him(即將變成him\w*)匹配。