2017-12-29 81 views
2

別のテキストファイルを辞書(構造体:Key sep :: tab value)を使用して、1つのファイルに含まれる単語を置き換えるコードを作成します。C#RegExと辞書を使用して「全体単語のみ」を置換する

現在のコード:

var fileDictionary = new Dictionary<string, string> 
    File.ReadLines(dictionaryPath, Encoding.Default) 
    .Select(line => line.Split(' ')) 
    .ToDictionary(data => data[0], data => data[1]), StringComparer.InvariantCultureIgnoreCase);//create dictionary based on text file 

for (int i = 0; i < rowNumber; i++) 
{ 
    var output = fileString[i].ToString();// current row, taked from other file 
    var replaced = Regex.Replace(output, String.Join("|", fileDictionary.Keys.Select(Regex.Escape)), m => fileDictionary[m.Value], RegexOptions.IgnoreCase); 
    var result = replaced.ToString(); 
    outputFile += result.ToString(); 
    outputFile += "\r\n"; 
} 

今まで、すべてが私は辞書で収集した単語を置き換えるために正規表現を使用しています、うまく働いたが、私はタイプ「のみ単語全体を」交換に問題があります。

私は「\ bsomewordの\ bの」@のようなパターンを使用することにしましたが、後述のように私はそれを実装する場合:

var replaced = Regex.Replace(output, String.Join("|", 
     String.Format(@"\b{0}\b", 
     fileDictionary.Keys.Select(Regex.Escape))), 
     m => fileDictionary[m.Value], RegexOptions.IgnoreCase); 

コードは結果を返しません。最終的なテキストファイルは、元のファイルのように見えます。何も起こりません。私は実際にキーを変更し、新しいものが現在の辞書に存在しないパターンを使用しているとき、問題が辞書キーにあることを認識します。したがって、キーが存在しない場合、値は置き換えられません。

誰にもどのような修正方法がありますか?あるいは、誰かがRegExと辞書を使って単語全体を置き換える他の方法を知っているかもしれませんか?パターンは辞書から正しく出力のためのStringBuilderを利用

var replaced = Regex.Replace(fileString, String.Join("|", fileDictionary.Select(m => @"\b" + Regex.Escape(m.Key) + @"\b")), m => fileDictionary[m.Value], RegexOptions.IgnoreCase); 

を解析していなかったように見えます

+0

代わりにパターンとして '\ w *'を試してください。単語境界文字を正確に0回、その後に別の単語境界文字が続くので、あなたのパターンは\ b {0} \ b'というパターンは実際にはあまり意味がありません –

+0

"[^] \ w + $。!?]]コードは、スペースまたは文字列の先頭を受け入れ、最後にスペース、文字列の終わり、疑問符、感嘆符またはピリオドを受け入れます。 – jdweng

+0

ちょうど私のパターンとjdwngの違いを指摘するために、鉱山は "[売上]"の "販売"と一致しますが、彼はそうしません。選択するパターンは、実際の要件に基づいています。 –

答えて

1

も、より効率的です。

関連する問題