Как заменить строку определенной позиции на соответствующий шаблон регулярного выражения в этой позиции - PullRequest
1 голос
/ 17 января 2020

Итак, у меня есть эта базовая c программа, которая соответствует определенному шаблону в строке, а затем сохраняет все соответствия в массиве. Затем я добавляю каждый соответствующий элемент в строку.

Теперь мой вопрос: как я могу заменить соответствующий шаблон в исходной строке измененной строкой, сгенерированной мной на основе моего regex.

Пример рабочей программы можно найти здесь: https://dotnetfiddle.net/UvgOVc

Как видно, последняя сгенерированная строка имеет только последнюю измененную строку. Как заменить соответствующие совпадения при замене?

Код:

using System;
using System.Text.RegularExpressions;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string url = "Please ab123456 this is and also bc789456 and also de456789 ";
        string[] queryString = getMatch(url,@"\w{2}\d{6}");
        string[] formatted=new string[10000];
        string finalurl=string.Empty;

        for(int i=0;i<queryString.Length;i++)
        {
            formatted[i]="replace "+queryString[i];
            Console.WriteLine(formatted[i]+"\n");
            finalurl=Regex.Replace(url,@"\w{2}\d{6}",formatted[i]);
        }

         Console.WriteLine(finalurl);
    }

    private static string[] getMatch(string text, string expr) 
     {
         string matched=string.Empty;
         string[] matches=new string[100];
         var mc = Regex.Matches(text, expr);         
         if ( text != string.Empty && mc.Count > 0)
         {
               matches =  mc.OfType<Match>()
              .Select(x => x.Value)
              .ToArray();
         }      
        return matches;
      }
}

Вывод:

replace ab123456

replace bc789456

replace de456789

Please replace de456789 this is and also replace de456789 and also replace de456789

1 Ответ

1 голос
/ 17 января 2020

Ваш код может быть уменьшен до

string url = "Please ab123456 this is and also bc789456 and also de456789 ";
string[] queryString = Regex.Matches(url,@"\w{2}\d{6}").Cast<Match>().Select(x => x.Value).ToArray();
string finalurl=Regex.Replace(url,@"\w{2}\d{6}", "replace $&");
Console.WriteLine(finalurl); // => Please replace ab123456 this is and also replace bc789456 and also replace de456789

См. онлайн C# демо .

Здесь Regex.Matches(url,@"\w{2}\d{6}").Cast<Match>().Select(x => x.Value).ToArray() собирает все совпадения в queryString переменная (если вам нужен массив значений совпадений).

Regex.Replace(url,@"\w{2}\d{6}", "replace $&") находит все совпадения двухсимвольных символов, за которыми следуют шесть цифр, и добавляет replace + пробел перед сопоставленными текстами (примечание $& обратная ссылка на все значение совпадения).

Если вы планируете еще какие-то манипуляции с найденными совпадениями, рассмотрите возможность использования оценщика совпадений. Скажем, вы где-то определили SomeMethod(string s), тогда вы можете использовать

string finalurl=Regex.Replace(url,@"\w{2}\d{6}", m =>
    SomeMethod(m.Value);
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...