2016-06-29 7 views
0

に一致するフレーズやテキストを正規表現するために、ワイルドカードを追加します。は私がで構成されていたテキストファイル持って

  1. を言葉(例えばmanipulat - 「操作」から茎を)茎、および
  2. は通常2つあるフレーズ茎(例えば、 "投資については彼に感謝する" - 「投資については彼に を認めているから」)。

各単語/句は新しい行に表示されます。私のC#コードは、このテキストファイルの各行を読み込み、各行について、DataTableのすべての行を検索して一致させます。すなわち、単語/句がDataTableの任意の行に表示される場合、私のシステムはその行にフラグを立てる。

単一の単語については、それは私が持っているアルゴリズムを使用して簡単に実行/照合される。 DataTableの行に表示される場合、「操作する」、「操作する」、「操作する」、「操作する」などの単語に「操作」を対応付けることができます。

しかし、フレーズの場合、私のアルゴリズムは正確に一致するだけです。ここでは、私のフレーズが「投資を考慮していることを認めて」いる場合は、正確なフレーズを検索し、「投資に関して彼を認めている」がDataTableの行に存在する場合は一致/フラグになりません。

私はRegexとC#の知識がほとんどありません。ワイルドカードを使用するために以下のコードを修正しようとしましたが、これまでのところ運がありません。誰でもこれを助けることができれば感謝します。進んでいただきありがとうございます。

RegExを使用して、データベースからの幹-言葉で行を比較するときに、あなたのコード内であなたのパターンを拡張することができ
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

あなたは彼がinvest'になると考えるacknowledg '、すなわちを正規表現パターンであることをフレーズを変更することができ、' acknowledg [-Z] *彼は考えて[-Z] *投資[-Z] * '。 –

+0

問題があります:あなただけのスペースで 'wordOrPhrase'を分割し、それぞれに' 'W * \追加した場合、あなたはhim''と 'himself'と一致する可能性(つまり、' W * \ '彼に変身することでしょう。とにかく、この上のあなたの計画? –

+1

、私がお勧めすることは 'Regex.IsMatch(r.Field ( "Column_nameの")、string.Join( "+" で、 \t \t \t wordOrPhrase.Split()。を選択した(p何ですか=> String.Formatの(@ "\ Bの{0} \ *の\ BのW"、Regex.Escape(P))))、RegexOptions.IgnoreCase) ' –

答えて

0

これは、任意の単語文字の1回以上の繰り返しにマッチしますAbbodanzaはすでに、これは間の任意の文字に一致します述べたように

\w+ 

この任意の単語文字

\w* 

の0回以上の繰り返しに一致します。 およびz 0回以上の出現。

[a-z]* 

EDIT:あなたのアルゴリズムは、単一の単語のために働く場合

あなたはこれを使用すると、テキスト内のすべての単一の単語にあなたのアルゴリズムを適用できるようにする必要があり、各フレーズ

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は、使用できるRegEx要素の一覧です。これは、各チャンクに([\p{L}\p{M}]*のような唯一のマッチ文字まで以上の特定のパターン)文字を0+英数字と一致するか、アンダースコアにあなたがスペースでwordOrPhraseを分割する場合

0

を助け、そして\w*を追加することができます

希望、あなたが使用することができますあなたはacknowledg him regard the investwordOrPhraseをお持ちの場合は

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

、正規表現は\backnowledg\w*\b +\bhim\w*\b +\bregard\w*\b +\bthe\w*\b +\binvest\w*\bとなり、試合があります。 this IDEONE demoを参照してください。

しかし、この手法では、himselfhim(これはhim\w*になります)と一致します。あなたは、データベースの値を変更できるかどう

関連する問題