找到&替换字符串中的自定义值C#

时间:2013-03-13 15:17:50

标签: c# regex replace

我是一名开发应用程序的学生,该应用程序获取PHP文件的内容并将其存储到变量中。

用户将在加载的内容中输入需要替换的字符/值。

例如:

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

然后可以将这些模式保存到文本文件中以供进一步使用。当用户想要根据模式删除内容时,他们可以通过单击按钮来删除内容。

所以我的问题是:

这可以通过基本的字符串替换方法轻松存档,还是应该使用更复杂的正则表达式?

如果我应该使用正则表达式,我如何根据用户输入创建自定义正则表达式模式?

如果你能帮助我,我将非常感激,谢谢你。

5 个答案:

答案 0 :(得分:3)

如果您只是尝试用另一组字符替换给定字符串中的一组字符,那么string.Replace()方法将很适合您。

任何程序员的目标都应该是为给定的任务编写最简单的代码。虽然正则表达式非常适合上下文替换,但如果您只需要基本的查找和替换功能,那么它们肯定是过度的,只会给您的程序带来不必要的复杂性。

答案 1 :(得分: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);
}

答案 2 :(得分:3)

到目前为止,我所看到的答案都没有提到谨慎,以确保迭代方法与原始源中不存在的FIND值不匹配(例如,您的第一个循环可能会替换{{1}使用echo,然后第二个循环可以替换Print(来自新int,例如Print离开Int32

使用一个非常简单的正则表达式可能会“更安全”,只是为了确保您只替换整个单词,这至少可以保护您免受上述示例的影响。

例如,不是搜索用户指定的字符串PrInt32,而是将其包含在正则表达式字边界中,然后搜索int(当然需要仔细测试以确保这适用于任何操作员可能在目标文件中,或者它适用于给定类型的搜索字符串等)。然后,您可以将其作为选项提供(类似于大多数文本编辑软件,提供“仅匹配整个单词”选项)。

此外,您需要确保不会使用相同的替换迭代相同的搜索目标 - 例如,确保\bint\b不会变为<?,然后变为<?php虽然我认为这里给出的任何答案都不会遇到这个问题。

答案 3 :(得分: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));

答案 4 :(得分:0)

反复使用String.Replace是最简单的方法,但它不会是最快的。我几乎先尝试这种方式,然后才开始使用正则表达式。但是,您必须注意替换文本可能与您的某个搜索片段匹配的可能性。

要使用正则表达式,您需要Regex.Escape每个搜索字符串,然后使用“|”连接所有转义模式作为分隔符。然后,您可以使用Regex.Replace执行单个MatchEvaluator查找替换。