C # получить смещение и длину определенного текстового формата, а затем заменить его другим текстом - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть текст, который содержит определенную динамику, подобную этой:

var text = "Hello @[123456:Foo] :) Hello @[44444:Bar]";

Мне нужно получить смещение и длину каждого шаблона "@ [aaa: bbb]"

поэтому для '@ [123456: Foo]' смещение равно 6, а длина равна 18 после получения этой информации. Мне нужно заменить @ [aaa: bbb] на bbb, поэтому после обработки текста вывод будет равен offset, length, id,имя для каждого @ [aaa: bbb] и всех @ [aaa: bbb], замененных на bbb с именем

=> Hello Foo :) Hello Bar

мой текущий код:

using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace Tests3
{
    internal struct EntityRange
    {
        // Offset of the entity
        public string Offset { get; set; }

        // Length of the entity
        public string Length { get; set; }
        public string EntityId { get; set; }

        public string EntityName { get; set; }

    }

    internal static class Program
    {
        public static void Main()
        {
            var text = "Hello @[123456:Foo] :) Hello @[44444:Bar]";
            var entitiesRangeList = GetEntityRangeList(text);
            text = ReplaceEntitiesWithName(text);

            // Queue  entitiesRangeList for processing..
        }

        private static string ReplaceEntitiesWithName(string text)
        {
            // replace @[aaa:bbb] with bbb

            return text;
        }

        private static List<EntityRange> GetEntityRangeList(string text)
        {
            var list = new List<EntityRange>();

            var matches = Regex.Matches(text, @"@\[(\d+):([^][]*)]");

            foreach (Match m in matches)
            {
                var e = new EntityRange();

                e.EntityId = m.Groups[1].Value;
                e.EntityName = m.Groups[2].Value;

                // e.Offset = ?
               // e.Length = ?

            }

            return list;
        }
    }
}

1 Ответ

0 голосов
/ 14 февраля 2019

Я предлагаю объявить Offset и Length как int типы:

internal struct EntityRange
{
    // Offset of the entity
    public int Offset { get; set; }

    // Length of the entity
    public int Length { get; set; }
    public string EntityId { get; set; }

    public string EntityName { get; set; }
}

Далее вы можете получить длину со свойством Match.Length и смещение со свойством Match.Index, ине забудьте добавить e в список, list.Add(e):

foreach (Match m in matches)
{
    var e = new EntityRange();
    e.EntityId = m.Groups[1].Value;
    e.EntityName = m.Groups[2].Value;
    e.Offset = m.Index;                  // HERE
    e.Length = m.Groups[2].Value.Length; // HERE
    list.Add(e);                         // HERE
}

Заменить текст легко, поскольку вы уже захватили имя:

private static string ReplaceEntitiesWithName(string text)
{
    return Regex.Replace(text, @"@\[\d+:([^][]*)]", "$1"); // replace @[aaa:bbb] with bbb
}

См. C # demo :

var text = "Hello @[123456:Foo] :) Hello @[44444:Bar]";
var entitiesRangeList = GetEntityRangeList(text);
foreach (var e in entitiesRangeList)
{
    Console.WriteLine($"Id={e.EntityId}, Name={e.EntityName}, Offset={e.Offset}, Length={e.Length}");
}
text = ReplaceEntitiesWithName(text);
Console.WriteLine(text);   

Вывод двух совпадений, найденных во входной строке:

Id=123456, Name=Foo, Offset=6, Length=3
Id=44444, Name=Bar, Offset=29, Length=3
Hello Foo :) Hello Bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...