2012-03-30 106 views
1

替換$(密鑰)在文本文件中我想要做這樣的事情,我有一個鍵和值的字典,和文本文件是這樣的:正則表達式與值從字典

Hello my name is $(Name) and my favorite movie is $(Movie). 

我想要讀取文件並根據字典中的值替換$(...)的出現位置,因此在這種情況下,字典將具有名稱和電影的關鍵字。

我該怎麼做呢?如果我通過每個字解析,這將是正則表達式匹配$(AnyWord),或將是更好的做這樣的事情:

foreach(var word in file) 
{ 
    if (word.length > 3) 
    { 
     if (word.substring(0,2)=="$(" && word.substring(word.length-1)==")") 
      Lookup word in dictionary 
    } 
} 

感謝

回答

3

使用MatchEvaluator完成替換操作:

var replacements = new Dictionary<string,string>(); 
//populate the dictionary 
string file = System.IO.File.ReadAllText("filepath"); 
file = Regex.Replace(file, @"\$\((?<key>[^)]+)\)", new MatchEvaluator(m => replacements.ContainsKey(m.Groups["key"].Value) ? replacements[m.Groups["key"].Value] : m.Value)); 

如果有任何語法錯誤,我向你道歉。目前我沒有C#編譯器,所以在回家時我必須修復它們。

+1

看起來不錯,小錯誤:'$'之前的單詞邊界和' )''不起作用,因爲'$'和')'是非單詞字符,所以你應該把它改爲'\ B'而不是一個單詞邊界,所以當它在左邊/右邊是非單詞字符時它會匹配。並且右括號需要轉義==>'@「\ B \ $ \([^)] + \)\ B」'應該是正確的正則表達式。 – stema 2012-03-30 08:40:08

+0

感謝修復,愚蠢的錯誤與未轉義的右括號。沒有意識到單詞邊界不匹配,所以感謝。儘管如此,如果他們並不總是打算與其他字符串分離,最好完全脫離邊界。 ''\\ $ \([^)] + \)「'應該沒有問題,謝謝stema – 2012-03-30 08:42:26

+0

我該如何編輯它,以便它匹配Hi $(name)Hi,Hi $(name)Hi,和 嗨($ name)嗨? – Matt 2012-03-30 18:20:42

1

如果你的文件不是很大,一個簡單的解決方案是反過來做。通過你的字典中的所有物品循環和更換令牌:

foreach(var item in dictionary) { 
    var token = string.Format("$({0})", item.Key); 

    file = file.Replace(token, item.Value); 
} 
+0

嗯,我實際上需要看所有的單詞出於其他原因已經和我的字典可能成爲非常大,所以是你建議更好的方式,或者是對每個單詞進行解析檢查,然後進行其他任何我需要處理的單詞。 – Matt 2012-03-30 08:27:50

0

您可以使用此正則表達式來找到像$字符串(字):

​​

解釋:

/      # regex delimiter 
    (     # matching brackets 
     \$    # the $ 
     \(   # the (
      \w*  # \w = a to z 
     \)    # the) 
    )     # close matching brackets 
/xi 

修飾符: I =不區分大小寫, X =忽略正則表達式的空格(所以你可以使其可讀性和這樣的評論)

+0

這是一個C#問題,請遵循C#正則表達式規範。 RegEx標誌是在各種RegEx函數的「options」參數中指定的,並且模式不需要像js,php..etc那樣的分隔符 – 2012-03-30 09:11:44