2013-03-13 79 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