2008-10-03 3 views
2

Что такое PHP preg_replace в C#?C# preg_replace?

У меня есть массив строк, который я бы хотел заменить другим массивом строки. Вот пример в PHP. Как я могу сделать что-то подобное на C# без использования .Replace («старый», «новый»).

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


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

ответ

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; 
    } 
} 

Вот что я буду использовать. Некоторый код Джонатана Холланда, но не в C# 3.5, а в C# 2.0 :)

Thx all.

2

Вы ищете System.Text.RegularExpressions;

using System.Text.RegularExpressions; 

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

Чтобы получить поведение массива в PHP, как у вас есть вам нужно несколько экземпляров `Regex

Однако, в вашем примере, вы бы гораздо лучше обслуживаться .Привернуть (старый, новый), это намного быстрее, чем компиляция состояний машин.

7

Настоящие мужчины используют регулярные выражения, но вот метод расширения, который добавляет его в строку, если вы хотите его:

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)); 
     }   
    } 
+0

Симпатичный вывод ... Как вам удалось добавить функцию в String? – 2008-10-03 13:52:42

3

Вы можете использовать. Выберите() (в .NET 3.5 и C# 3), чтобы облегчить применение функций к членам коллекции.

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

Вам не нужна поддержка регулярных выражений, вам просто нужен простой способ перебора массивов.

0

Редактировать: Uhg Я только понял, что этот вопрос был для 2.0, но я оставлю его, если у вас есть доступ к 3.5.

Просто еще один предмет Linq. Теперь я использовал List <Char> вместо Char [], но это только для того, чтобы выглядеть немного чище. На массивах нет метода IndexOf, но есть один в списке. Зачем мне это нужно? Ну, из того, что я предполагаю, нет прямой корреляции между списком замещения и списком заменяемых. Просто индекс.

Итак, имея в виду, вы можете сделать это с помощью Char [] просто отлично. Но когда вы видите метод IndexOf, перед ним нужно добавить .ToList().

Как это:. SomeArray.ToList() IndexOf

 
    String text; 
    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 = "This is a thing to replace stuff with"; 

    var allAsAndCs = text.ToCharArray() 
       .Select 
       (
        currentItem => patternsToReplace.Contains(currentItem) 
        ? patternsToUse[patternsToReplace.IndexOf(currentItem)] 
        : currentItem 
       ) 
       .ToArray(); 

    text = new String(allAsAndCs); 

Это просто преобразует текст в массив символов, выбирает через каждый из них. Если текущий символ не находится в списке заметок, просто отправьте обратно символ как есть. Если он находится в списке заметок, верните символ в том же индексе списка замещающих символов. Последняя вещь - создать строку из массива символов.

 
    using System; 
    using System.Collections.Generic; 
    using System.Linq;