Что такое preg_replace PHP в C#?
У меня есть массив строк, который я хотел бы заменить другим массивом строк. Вот пример на 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);





Вы ищете System.Text.RegularExpressions;
using System.Text.RegularExpressions;
Regex r = new Regex("=C0");
string output = r.Replace(text);
Чтобы получить такое поведение массива PHP, как у вас, вам понадобится несколько экземпляров Regex
Однако в вашем примере вам будет намного лучше обслуживаться .Replace (old, new), это намного быстрее, чем компиляция конечных автоматов.
Настоящие мужчины используют регулярные выражения, но вот метод расширения, который добавляет его в 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? В этом заключается вся магия расширения класса String.
Вы можете использовать .Select () (в .NET 3.5 и C# 3), чтобы упростить применение функций к членам коллекции.
stringsList.Select( s => replacementsList.Select( r => s.Replace(s,r) ) );
Вам не нужна поддержка регулярных выражений, вам просто нужен простой способ перебора массивов.
Обновлено: Uhg Я только что понял, что этот вопрос был для 2.0, но я оставлю его на случай, если у вас есть доступ к 3.5.
Еще один взгляд на Linq. Теперь я использовал List <Char> вместо Char [], но это просто для того, чтобы он выглядел немного чище. Для массивов нет метода IndexOf, но он есть в списке. Зачем мне это было нужно? Что ж, из того, что я предполагаю, нет прямой корреляции между списком замен и списком тех, которые должны быть заменены. Просто index.
Имея это в виду, вы можете сделать это с помощью 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;
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 :)
Спасибо всем.
Симпатичный вывод ... А как тебе удалось добавить функцию в String?