Я предлагаю объявить 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