Вопрос

Что такое 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top