C# preg_replace?

Что такое 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);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
10 418
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы ищете 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?

Matthew Scharley 03.10.2008 17:52

Я действительно не вижу, как изменить класс String.

Patrick Desjardins 03.10.2008 18:46

Видите, как он передает this в качестве первого параметра своего метода замены preg? В этом заключается вся магия расширения класса String.

tyshock 03.10.2008 19:02

Вы можете использовать .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 :)

Спасибо всем.

Другие вопросы по теме