我是一名开发应用程序的学生,该应用程序获取PHP文件的内容并将其存储到变量中。
用户将在加载的内容中输入需要替换的字符/值。
例如:
FIND REPLACE
echo Print
<?php <?
CURL (space)
然后可以将这些模式保存到文本文件中以供进一步使用。当用户想要根据模式删除内容时,他们可以通过单击按钮来删除内容。
所以我的问题是:
这可以通过基本的字符串替换方法轻松存档,还是应该使用更复杂的正则表达式?
如果我应该使用正则表达式,我如何根据用户输入创建自定义正则表达式模式?
如果你能帮助我,我将非常感激,谢谢你。
答案 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
查找替换。