4

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

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

例如 :

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

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

所以我的问题是:

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

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

如果您能帮我解决这个问题,我将不胜感激,谢谢。

4

5 回答 5

3

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

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

于 2013-03-13T15:23:24.190 回答
3

可以通过简单的方式来实现Replace,一个处理如此复杂的需求的正则表达式不仅会很混乱,而且很难用额外的项目来维护/更新。

如何将您的查找和替换模式存储在 a 中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);
}
于 2013-03-13T15:23:42.163 回答
3

到目前为止,我所看到的答案都没有提到要谨慎,以确保迭代方法与原始源中不存在的 FIND 值不匹配(例如,您的第一个循环可能替换echoPrint,但随后循环两个可能替换int(从新的内部Print,例如Int32离开PrInt32)。

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

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

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

于 2013-03-13T15:30:35.067 回答
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));
于 2013-03-13T15:23:38.107 回答
0

重复使用String.Replace是最简单的方法,但不会是最快的。我几乎会先尝试这种方式,然后只有在速度不够快的情况下才切换到使用正则表达式。但是,您必须小心替换文本可能与您的搜索片段之一匹配的可能性。

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

于 2013-03-13T15:23:07.833 回答