2013-03-13 80 views
4

我是一名學生,開發一個應用程序,它將PHP文件的內容存儲到變量中。查找並替換字符串中的自定義值C#

用戶將在加載的內容中輸入需要替換的字符/值。

例如:

FIND   REPLACE 
echo   Print 
<?php   <? 
CURL   (space) 

這些模式則可以保存爲進一步使用的文本文件。當用戶想要根據模式刪除內容時,他們可以通過點擊按鈕來完成。

所以我的問題是:

可以通過這個基本字符串容易存檔更換方法,或者我應該去一個更復雜的正則表達式?

如果我應該使用正則表達式,我該如何根據用戶輸入創建自定義正則表達式模式?

如果您能幫助我,我將非常感激,謝謝。

+0

http://whathaveyoutried.com/? – 2013-03-13 15:23:07

回答

3

可以只需使用Replace就可以實現,正則表達式處理這種複雜的需求不僅會很麻煩,而且難以置信地難以維護/更新與額外的項目。

如何將您的查找和替換模式存儲在Dictionary中,然後循環並進行替換?這樣,如果你添加更多的物品,你只需要將它們添加到你的Dictionary。喜歡的東西:

Dictionary<string, string> replacements = new Dictionary<string, string> 
              { 
               { "echo", "PRINT" }, 
               { "<?php", "<?" }, 
               { "CURL", "(space)" } 
              } 

string yourString; //this is your starter string, populate it with whatever 

foreach (var item in replacements) 
{ 
    yourString = yourString.Replace(item.Key, item.Value); 
} 
+0

完美和乾淨答案。謝謝先生 – DriverBoy 2013-03-13 15:32:35

+0

@DriverBoy沒問題!很高興我可以幫助:) – mattytommo 2013-03-13 15:33:37

+0

從我+1。 @DriverBoy請參考我的回答,關於對意外迭代替換持謹慎態度。 – Sepster 2013-03-13 15:34:11

0

反覆使用String.Replace是最簡單的方法,但它不會是最快的。我幾乎是先嚐試這種方式,然後纔開始使用正則表達式。不過,您必須小心替換文本可能與您的某個搜索片段匹配的可能性。

要使用正則表達式,您需要每個搜索字符串Regex.Escape,然後使用'|'連接所有轉義模式。作爲分隔符。然後,您可以使用MatchEvaluator執行一個Regex.Replace查找替換。

3

如果您只是試圖用另一組字符替換給定字符串中的一組字符,那麼string.Replace()方法將很適合您。

任何程序員的目標應該是爲給定的任務編寫最簡單的代碼。雖然正則表達式非常適合上下文替換,但如果您只需要基本的查找和替換功能,那麼它們肯定是矯枉過正,並且只會爲您的程序帶來不必要的複雜性。

1

您可以使用字典進行重複調用Replace更容易:

var replacements = new Dictionary<string, string>(); 
replacements.Add("echo", "print"); 
replacements.Add("<?php", "<?"); 
... 

foreach(var pair in replacements) 
{ 
    myString = myString.Replace(pair.Key, pair.Value); 
} 

或者使用Linq的Aggregate方法。

myString = replacements.Aggregate(myString, (s, p) => s.Replace(p.Key, p.Value)); 

這將簡單的字符串的工作,但也可以使用相同的一般設計爲正則表達式模式,以及:

var replacements = new Dictionary<string, string>(); 
... 

foreach(var pair in replacement) 
{ 
    myString = new RegEx(pair.Key).Replace(myString, pair.Value); 
} 

並再次使用LINQ:

myString = replacements.Aggregate(myString, (s, p) => new RegEx(pair.Key).Replace(s, p.Value)); 
3

到目前爲止,我已經看到了答案都不做要謹慎提及,以確保迭代的方法不匹配查找不是有原始出處值(例如你的第一個環可能與Print取代echo,但隨後循環二可能接替int(從新Print內,如與Int32離開PrInt32)。

您可能是「安全」的使用非常簡單的regex只是,以確保您只能替換整個單詞,至少可以保護你免受我上面的例子

例如,而不是搜索用戶指定的字符串int,包裹在正則表達式單詞邊界,並搜索,而不是\bint\b(當然需要仔細測試,以確保其工作原理與任何運營商可能會在目標文件,或它適用於給定類型的搜索字符串等)。然後,您可以將其作爲選項提供(類似於大多數文本編輯軟件提供「僅匹配全字」選項)。

而且你需要確保你永遠不要遍歷相同的搜索目標具有相同取代 - 例如確保<?不會成爲<?php再後來成爲<?<?php等。雖然我不認爲任何的這裏給出的答案會遭遇這個問題。

+0

+1這真的很有幫助。我一定會修改這些代碼。謝謝 – DriverBoy 2013-03-13 16:02:38

+0

@DriverBoy我的快樂伴侶。 – Sepster 2013-03-18 00:17:45