2

C# 中的 PHP preg_replace 是什么?

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

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


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

5 回答 5

8

真正的男人使用正则表达式,但如果需要,这里有一个扩展方法,可以将它添加到 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));
        }        
    }
于 2008-10-03T13:44:22.750 回答
3

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

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

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

于 2008-10-03T13:44:23.953 回答
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 中:)

谢谢大家。

于 2008-10-03T15:00:10.773 回答
2

您正在寻找System.Text.RegularExpressions

using System.Text.RegularExpressions;

Regex r = new Regex("=C0");
string output = r.Replace(text);

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

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

于 2008-10-03T13:36:40.457 回答
0

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

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

所以考虑到这一点,你可以用 Char[] 来做这件事。但是当你看到 IndexOf 方法时,你必须在它之前添加一个 .ToList() 。

像这样: someArray.ToList().IndexOf

  字符串文本;
  List<Char> patternsToReplace;
  List<Char> patternsToUse;

  patternsToReplace = new List<Char>();
  patternsToReplace.Add('a');
  patternsToReplace.Add('c');
  patternsToUse = new List<Char>();
  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;
于 2008-10-03T14:24:06.867 回答