Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析字符串中的标记_C#_String_Token - Fatal编程技术网

C# 解析字符串中的标记

C# 解析字符串中的标记,c#,string,token,C#,String,Token,注意:我用的是“token”这个词,但我不确定它是否是这类东西的正确术语 我有一个带标记的字符串,看起来像这样:我是{name},blablabla{a:foo}和{a,b:bar} 因此,每个标记都被{}包围,并且可以在:之前有一些设置(逗号分隔的列表)。所以每个标记看起来要么像{id}要么像{set,tings:id}。可能还有一些额外的空白:{set,tings:id} 现在我有了提供这些id的对象。例如,我有两个对象,一个id为name==“Jef”,另一个id为name==“An”。但

注意:我用的是“token”这个词,但我不确定它是否是这类东西的正确术语

我有一个带标记的字符串,看起来像这样:
我是{name},blablabla{a:foo}和{a,b:bar}

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

现在我有了提供这些id的对象。例如,我有两个对象,一个id为
name==“Jef”
,另一个id为
name==“An”
。但实际上我有很多东西。这些对象有一个
stringgetvalue(stringid)
方法。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);
}
公共类令牌
{
私有字符串_id;
公共字符串ID{get{return}ID;}
私有字符串设置;
公共令牌(字符串令牌)
{
if(标记.包含(“:”)
{
int separator=token.IndexOf(“:”);
_settings=token.Substring(0,分隔符).Trim();
_id=token.Substring(分隔符+1).Trim();
}
其他的
{
_id=token.Trim();
}
}
公共字符串GetValueFrom(CardInfo-CardInfo)
{
string value=cardInfo.GetById(_id).value;//GetById出于某种原因返回字符串的包装器,但是.value总是给出一个字符串。
如果(_settings!=null&&u settings.Contains(“e”))
{
value=WWW.EscapeURL(value);//WWW from Unity
}
返回值;
}
}
私有静态只读正则表达式令牌_Regex=新正则表达式(@“{.+}”);
公共静态IEnumerable GetAllTokensFrom(字符串文本)
{
返回TOKEN_REGEX.Matches(text.Cast().Select(m=>newtoken(m.Groups[1].Value));
}
公共静态字符串FillAllTokensIn(字符串文本,CardInfo信息)
{
返回TOKEN_REGEX.Replace(text,m=>TranslateToken(m.Groups[1].Value,info));
}
私有静态字符串TranslateToken(字符串值,CardInfo卡)
{
令牌=新令牌(值);
返回令牌。GetValueFrom(卡);
}

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

看看Codeproject上的发现。

你的问题有点模糊和宽泛。你能提供更多具体的例子并分享你的一些代码吗?@MattBurland我添加了我当前的代码。它被很快地组合在一起,目前还远远不是很好。
…但是这有点慢
-请定义
。它的速度有多慢?你期待什么?我还没有做过任何真正的性能测试,所以说它慢是错误的。但每次我想要填充或获取令牌时,代码都必须在字符串上匹配/替换为regex,这是不对的。看来应该有更好的办法。我已经更新了我的问题,将其重新表述为我真正的问题。