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