找到,替换字符串中的自定义值

本文关键字:自定义 字符串 替换 找到 | 更新日期: 2023-09-27 18:03:39

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

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

例如:

FIND           REPLACE
echo           Print
<?php          <?
CURL           (space)
然后可以将这些模式保存到文本文件中以供以后使用。当用户想要根据模式删除内容时,他们可以通过单击按钮来完成。

我的问题是:

这可以很容易地通过一个基本的字符串替换方法存档,或者我应该去一个更复杂的正则表达式?

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

如果你能帮我,我会非常感激的,谢谢。

找到,替换字符串中的自定义值

这个可以使用简单的Replace来实现,处理如此复杂的需求的Regex不仅会很混乱,而且难以维护/使用额外的项更新

如何将您的查找和替换模式存储在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);
}

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

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

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

你可能使用一个非常简单的正则表达式来确保你只替换一个完整的单词会更"安全",这至少会保护你免受我上面的例子。

Eg不是搜索用户指定的字符串int,而是将其包装在regex单词边界中并搜索'bint'b(当然需要仔细测试以确保这与目标文件中的任何操作符一起工作,或者它适合给定类型的搜索字符串等)。然后,您可以将其作为一个选项提供(类似于大多数文本编辑软件提供"仅匹配整个单词"选项)。

你还需要确保你不会用相同的替换迭代相同的搜索目标-例如确保<?不会变成<?php,然后变成<?<?php等。尽管我认为这里给出的任何答案都不会遇到这个问题

您可以使用字典更容易地重复调用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));

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

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