【问题标题】:C# preg_replace?C# preg_replace?
【发布时间】:2008-10-03 13:30:59
【问题描述】:

什么是 C# 中的 PHP preg_replace?

我有一个字符串数组,我想用另一个字符串数组替换它。这是 PHP 中的一个示例。如何在 C# 中不使用 .Replace("old","new") 做类似的事情。

$patterns[0] = '/=C0/';
$patterns[1] = '/=E9/';
$patterns[2] = '/=C9/';


$replacements[0] = 'à';
$replacements[1] = 'é';
$replacements[2] = 'é';
return preg_replace($patterns, $replacements, $text);

【问题讨论】:

    标签: c# .net .net-2.0 preg-replace


    【解决方案1】:

    真正的男人使用正则表达式,但如果需要,这里有一个扩展方法,可以将它添加到 String:

    public static class ExtensionMethods
    {
        public static String PregReplace(this String input, string[] pattern, string[] replacements)
        {
            if (replacements.Length != pattern.Length)
                throw new ArgumentException("Replacement and Pattern Arrays must be balanced");
    
            for (var i = 0; i < pattern.Length; i++)
            {
                input = Regex.Replace(input, pattern[i], replacements[i]);                
            }
    
            return input;
        }
    }
    

    你可以这样使用它:

     class Program
        {
            static void Main(string[] args)
            {
                String[] pattern = new String[4];
                String[] replacement = new String[4];
    
                pattern[0] = "Quick";
                pattern[1] = "Fox";
                pattern[2] = "Jumped";
                pattern[3] = "Lazy";
    
                replacement[0] = "Slow";            
                replacement[1] = "Turtle";
                replacement[2] = "Crawled";
                replacement[3] = "Dead";
    
                String DemoText = "The Quick Brown Fox Jumped Over the Lazy Dog";
    
                Console.WriteLine(DemoText.PregReplace(pattern, replacement));
            }        
        }
    

    【讨论】:

    • 可爱的输出......你是如何设法将函数添加到字符串的?
    • 我真的不明白如何改变String类。
    • 看看他是如何将“this”传递给他的 preg replace 方法的第一个参数的?这就是扩展 String 类的所有魔力。
    【解决方案2】:

    您可以使用 .Select()(在 .NET 3.5 和 C# 3 中)来简化将函数应用于集合成员的过程。

    stringsList.Select( s => replacementsList.Select( r => s.Replace(s,r) ) );
    

    您不需要正则表达式支持,您只需要一种简单的方法来迭代数组。

    【讨论】:

      【解决方案3】:
      public static class StringManipulation
      {
          public static string PregReplace(string input, string[] pattern, string[] replacements)
          {
              if (replacements.Length != pattern.Length)
                  throw new ArgumentException("Replacement and Pattern Arrays must be balanced");
      
              for (int i = 0; i < pattern.Length; i++)
              {
                  input = Regex.Replace(input, pattern[i], replacements[i]);                
              }
      
              return input;
          }
      }
      

      这是我将使用的。 Jonathan Holland 的一些代码,但不是在 C#3.5 中,而是在 C#2.0 中:)

      谢谢。

      【讨论】:

        【解决方案4】:

        您正在寻找System.Text.RegularExpressions

        using System.Text.RegularExpressions;
        
        Regex r = new Regex("=C0");
        string output = r.Replace(text);
        

        要按照您的方式获得 PHP 的数组行为,您需要多个 `Regex 实例

        但是,在您的示例中,.Replace(old, new) 会为您提供更好的服务,它比编译状态机要快得多。

        【讨论】:

          【解决方案5】:

          编辑:呃,我刚刚意识到这个问题是针对 2.0 的,但如果您确实可以访问 3.5,我会留下它。

          对 Linq 的另一种看法。现在我使用 List 而不是 Char[] 但这只是为了让它看起来更干净一些。数组上没有 IndexOf 方法,但 List 上有一个。为什么我需要这个?好吧,从我的猜测来看,替换列表和要替换的列表之间没有直接关联。只是索引。

          因此,考虑到这一点,您可以使用 Char[] 来执行此操作。但是当你看到 IndexOf 方法时,你必须在它之前添加一个 .ToList() 。

          像这样:someArray.ToList().IndexOf

          字符串文本; List patternsToReplace; List patternsToUse; patternsToReplace = new List(); patternsToReplace.Add('a'); patternsToReplace.Add('c'); patternsToUse = new List(); patternsToUse.Add('X'); patternsToUse.Add('Z'); text = "这是一个可以替换的东西"; var allAsAndCs = text.ToCharArray() 。选择 ( currentItem => patternsToReplace.Contains(currentItem) ? patternsToUse[patternsToReplace.IndexOf(currentItem)] :当前项目 ) .ToArray(); 文本 = 新字符串(allAsAndCs);

          这只是将文本转换为字符数组,通过每一个进行选择。如果当前字符不在替换列表中,则按原样发回字符。如果它在替换列表中,则返回替换字符列表相同索引中的字符。最后一件事是从字符数组创建一个字符串。

          使用系统; 使用 System.Collections.Generic; 使用 System.Linq;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-14
            • 2013-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-29
            • 2011-01-27
            相关资源
            最近更新 更多