解析字符串中的令牌

本文关键字:令牌 字符串 | 更新日期: 2023-09-27 18:18:44

注意:我使用的是"token"这个词,但我不确定它是否是这种东西的正确术语。

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

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

现在我有了提供这些id的对象。例如,我有两个对象,一个id为name == "Jef",另一个id为name == "An"。但实际上我有很多很多的物品。对象有一个string getValue(string id)方法。id的值总是字符串。我也有一些功能对应于这些设置。例如,如果lower是其中一个设置,那么最终结果将是所有小写字母。最后,我需要用id后面的值填充所有令牌,并应用所需的设置。

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

此刻,我正在使用regex的组合来获得{}之间的东西,然后用完全自定义的代码解析。每次我想用值填充字符串时,我也会再次解析字符串,但这看起来有点难看。因此,如果有更好的方法来做到这一点,也许甚至是一些(内置的)库,那将是伟大的。

注意:我正在使用{a,b:id}方案,因为我喜欢它的外观,但如果有更好的方法来表示我的字符串中的这些令牌,我很好。然而,有些字符串是url,所以我不能使用/或其他东西作为分隔符。


我的当前代码:

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);
}

注意:我目前只有设置"e",所以我实际上还没有解析设置作为逗号分隔的列表

解析字符串中的令牌

看看在Codeproject上找到的FastReplacer