使用带有扭曲的C#查找子字符串

时间:2015-03-03 02:06:29

标签: c# regex string

我有一个字符串,其中包含以下格式的众多标记:

<: Entity.FieldGroup.FieldName [| Modifier] :>

我需要找到标签并用一些值替换它们。例如,我的文字可能如下所示:

Blah <: Person.Meta.Age :> blah <:       PERSON.meTA.Dependants | CommaList :>

当替换时看起来像:

Blah 30 blah Harry, Mary, John

现在的问题是:

  • 在开始和结束标记之前和之后可能有不同数量的空格(&lt ;:和:&gt;)
  • 可能会输入不同的案例Person vs PERSON,Meta vs meTA
  • 我不能&#34;影响&#34;标签周围的文字
  • 没有预定的标签名称列表,即。明天可能会带来Animal.Kind

因此,从性能的角度来看,提取标签的最佳方法是什么,以便我可以替换它们?

我担心当我替换标签时,我将替换为变化的字符串的长度,因此任何偏移都不会起作用等等。关于如何优雅地实现上述任何建议?

1 个答案:

答案 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.ReplaceTokenToReplace