用字符串解析标记

时间:2015-10-20 19:41:46

标签: c# string token

注意:我使用"令牌"这个词,但我不确定它是否适用于此类内容。

我有一个带有令牌的字符串,看起来像这样:I'm {name}, blablabla {a:foo} and {a,b : bar}

因此每个令牌都被{}包围,并且可以在:之前设置一些设置(以逗号分隔的列表)。因此,每个令牌看起来都是{id}{set,tings:id}。可能还有一些额外的空格:{ set, tings : id }

现在我有了提供这些内容的对象。例如,我有2个对象,一个标识为name == "Jef",另一个标识为name == "An"。但实际上我有很多对象。对象具有string getValue(string id)方法。 id的值总是字符串。我还有一些与这些设置相对应的方法。因此,例如,如果lower是其中一个设置,则最终结果将是所有低位字母。最后,我需要所有令牌都填充id后面的值以及要应用的所需设置。

我只有一些这些字符串,但它们需要被许多不同的对象填充。所以我想知道解析这个的好方法是什么?通过某种预处理,使字符串只能被解释一次,然后可以很快地填充多次。

目前,我正在使用正则表达式的组合来获取{}之间的内容,然后使用完全自定义代码解析它。每次我想用值填充它时,我也只是再次解析字符串,但这看起来有点难看。因此,如果有更好的方法可以做到这一点,甚至可能还有一些(buildin)库,那就太好了。

注意:我使用的是{a,b:id}方案,因为我喜欢它的外观,但是如果有更好的方法在我的字符串中表示这些代币我就可以了。但是,有些字符串是网址,因此我无法使用/或其他内容作为分隔符。

我目前的代码:

public class Token
{
    private string _id;
    public string ID { get { return _id; } }

    private string _settings;

    public Token(string token)
    {
        if (token.Contains(":"))
        {
            int separator = token.IndexOf(":");
            _settings = token.Substring(0, separator).Trim();
            _id = token.Substring(separator+1).Trim();
        }
        else
        {
            _id = token.Trim();
        }
    }

    public string GetValueFrom(CardInfo cardInfo)
    {
        string value = cardInfo.GetById(_id).Value; // GetById returns a wrapper for string for some reason, but .Value always gives a string.
        if (_settings != null && _settings.Contains("e"))
        {
            value = WWW.EscapeURL(value); //WWW from Unity
        }

        return value;
    }
}



private static readonly Regex TOKEN_REGEX = new Regex(@"{(.+)}");

public static IEnumerable<Token> GetAllTokensFrom(string text)
{
    return TOKEN_REGEX.Matches(text).Cast<Match>().Select(m => new Token(m.Groups[1].Value));
}

public static string FillAllTokensIn(string text, CardInfo info)
{
    return TOKEN_REGEX.Replace(text, m => TranslateToken(m.Groups[1].Value, info));
}

private static string TranslateToken(string value, CardInfo card)
{
    Token token = new Token(value);
    return token.GetValueFrom(card);
}

注意:我目前只有设置&#34; e&#34;,因此我实际上并未将 设置解析为逗号分隔列表。

1 个答案:

答案 0 :(得分:1)

查看Codeproject上的FastReplacer