我有一个字符串,其中包含以下格式的众多标记:
<: Entity.FieldGroup.FieldName [| Modifier] :>
我需要找到标签并用一些值替换它们。例如,我的文字可能如下所示:
Blah <: Person.Meta.Age :> blah <: PERSON.meTA.Dependants | CommaList :>
当替换时看起来像:
Blah 30 blah Harry, Mary, John
现在的问题是:
因此,从性能的角度来看,提取标签的最佳方法是什么,以便我可以替换它们?
我担心当我替换标签时,我将替换为变化的字符串的长度,因此任何偏移都不会起作用等等。关于如何优雅地实现上述任何建议?
答案 0 :(得分:1)
这是获取您请求的令牌的一种方法,以便您可以进行替换。
.NET小提琴就在这里:https://dotnetfiddle.net/6bX0Db
首先,这是一个使用正则表达式来识别匹配标记的方法:
public Token[] GetTokens(string input)
{
string pattern = @"<:[\W]*[\w\d]+\.[\w\d]+\.[\w\d]+[\W]*(|[\W]*[\w\d]+)?[\W]*:>";
var tokens = Regex.Matches(input, pattern)
.OfType<Match>()
.Select(m => new Token(m.Value))
.ToArray();
return tokens;
}
然后,我创建了一个Token
对象,它将匹配的标签解析为实体字段和修饰符(如果提供)。
public class Token
{
public string TokenToReplace { get; set; }
public string EntityField { get; set; }
public string Modifier { get; set; }
public Token(string tag)
{
this.TokenToReplace = tag;
this.EntityField = Regex.Match(tag, @"[\w\d]+\.[\w\d]+\.[\w\d]+").Value;
this.Modifier = tag.Contains("|") ? Regex.Match(tag.Split('|').Last(), @"[\w\d]+").Value : null;
}
}
这为我产生了输出:
Field: Person.Meta.Age, Modifier: , Orig: <: Person.Meta.Age :>
Field: PERSON.meTA.Dependants, Modifier: CommaList, Orig: <: PERSON.meTA.Dependants | CommaList :>
从这里开始,您将拥有一组匹配的标记,其中包含实体字段和修饰符。使用基本策略或代理模式,您应该能够将现有的替换逻辑应用于可以替换的修饰符和标记。我只是使用修饰符/标记替换逻辑的输出迭代String.Replace
值TokenToReplace
。