查找并替换字符串中的自定义值C#
我是一名学生,开发一个应用程序,它将PHP文件的内容存储到变量中。查找并替换字符串中的自定义值C#
用户将在加载的内容中输入需要替换的字符/值。
例如:
FIND REPLACE
echo Print
<?php <?
CURL (space)
这些模式则可以保存为进一步使用的文本文件。当用户想要根据模式删除内容时,他们可以通过点击按钮来完成。
所以我的问题是:
可以通过这个基本字符串容易存档更换方法,或者我应该去一个更复杂的正则表达式?
如果我应该使用正则表达式,我该如何根据用户输入创建自定义正则表达式模式?
如果您能帮助我,我将非常感激,谢谢。
这可以只需使用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);
}
完美和干净答案。谢谢先生 – DriverBoy 2013-03-13 15:32:35
@DriverBoy没问题!很高兴我可以帮助:) – mattytommo 2013-03-13 15:33:37
从我+1。 @DriverBoy请参考我的回答,关于对意外迭代替换持谨慎态度。 – Sepster 2013-03-13 15:34:11
反复使用String.Replace
是最简单的方法,但它不会是最快的。我几乎是先尝试这种方式,然后才开始使用正则表达式。不过,您必须小心替换文本可能与您的某个搜索片段匹配的可能性。
要使用正则表达式,您需要每个搜索字符串Regex.Escape
,然后使用'|'连接所有转义模式。作为分隔符。然后,您可以使用MatchEvaluator
执行一个Regex.Replace
查找替换。
如果您只是试图用另一组字符替换给定字符串中的一组字符,那么string.Replace()
方法将很适合您。
任何程序员的目标应该是为给定的任务编写最简单的代码。虽然正则表达式非常适合上下文替换,但如果您只需要基本的查找和替换功能,那么它们肯定是矫枉过正,并且只会为您的程序带来不必要的复杂性。
您可以使用字典进行重复调用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));
到目前为止,我已经看到了答案都不做要谨慎提及,以确保迭代的方法不匹配查找不是有原始出处值(例如你的第一个环可能与Print
取代echo
,但随后循环二可能接替int
(从新Print
内,如与Int32
离开PrInt32
)。
您可能是“安全”的使用非常简单的regex只是,以确保您只能替换整个单词,至少可以保护你免受我上面的例子
例如,而不是搜索用户指定的字符串int
,包裹在正则表达式单词边界,并搜索,而不是\bint\b
(当然需要仔细测试,以确保其工作原理与任何运营商可能会在目标文件,或它适用于给定类型的搜索字符串等)。然后,您可以将其作为选项提供(类似于大多数文本编辑软件提供“仅匹配全字”选项)。
而且你需要确保你永远不要遍历相同的搜索目标具有相同取代 - 例如确保<?
不会成为<?php
再后来成为<?<?php
等。虽然我不认为任何的这里给出的答案会遭遇这个问题。
http://whathaveyoutried.com/? – 2013-03-13 15:23:07