【问题标题】:Find & Replace Custom Values In a String C#在字符串 C# 中查找和替换自定义值
【发布时间】:2013-03-01 14:55:41
【问题描述】:

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

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

例如:

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

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

所以我的问题是:

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

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

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

【问题讨论】:

    标签: c# regex replace


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1 这真的很有帮助。我肯定会将这些修改到代码中。谢谢
    • @DriverBoy 我的快乐伙伴。
    【解决方案2】:

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

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

      • 完美而干净的答案。谢谢楼主
      • @DriverBoy 没问题!很高兴我能帮忙:)
      • +1 来自我。 @DriverBoy 也请参考我下面的回答,以防意外迭代替换。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-09
          • 2020-08-12
          • 2011-08-22
          • 2014-02-16
          • 2015-09-22
          • 2019-06-24
          • 2016-01-13
          相关资源
          最近更新 更多