C# 从字符串c捕获字符串#

C# 从字符串c捕获字符串#,c#,regex,string,formatting,substring,C#,Regex,String,Formatting,Substring,我需要格式化用户输入的一些文本 例如:string str=“{Lorem Ipsum | bold}}”只是印刷和排版行业的虚拟文本 我使用IndexOf从字符串中提取了Lorem Ipsum,并以粗体显示。但面临的问题是,若我有两个字的格式在同一个字符串 例如:string str=“{Lorem Ipsum|bold}}”只是“{printing | blue}}”和排版行业的虚拟文本 有人能帮我用任何正则表达式模式来提取{Lorem Ipsum | bold}和{printing | b

我需要格式化用户输入的一些文本

例如:
string str=“{Lorem Ipsum | bold}}”
只是印刷和排版行业的虚拟文本

我使用
IndexOf
从字符串中提取了Lorem Ipsum,并以粗体显示。但面临的问题是,若我有两个字的格式在同一个字符串

例如:
string str=“{Lorem Ipsum|bold}}”
只是
“{printing | blue}}”和排版行业的虚拟文本

有人能帮我用任何正则表达式模式来提取
{Lorem Ipsum | bold}
{printing | blue}}
作为c#中的数组。

注:图案有时可能是
{打印|蓝色,粗体,http://www.google.com}}

用于格式化的扩展方法。我已经为测试进行了硬编码,稍后我将进行相应的优化

public static string Format(this string value)
    {
        System.Uri uriResult = null;
        bool result = false;
        string path = ConfigurationManager.AppSettings["path"];
        if (value.Length > 0)
        {
            if (value.Contains("{{") && value.Contains("|") && value.Contains("}}"))
            {
                int totalLength = value.Length;
                string unformattedText = value.Substring(value.IndexOf("{{"), (value.IndexOf("}}") - value.IndexOf("{{")) + 2);
                string flowersRemoved = unformattedText.Substring(0, unformattedText.Length - 2);
                flowersRemoved = flowersRemoved.Substring(2, flowersRemoved.Length - 2);
                string[] textFormats = flowersRemoved.Split('|');
                string text = textFormats[0];
                string[] formats = textFormats[1].Split(',');
                foreach (string format in formats)
                {
                    result = Uri.TryCreate(format.ToLower(), UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
                    if (format.ToLower() == "bold")
                        text = "<b>" + text + "</b>";
                    else if (format.ToLower() == "red")
                        text = "<font color = \"red\">" + text + "</font>";
                    else if (format.ToLower() == "blue")
                        text = "<font color = \"blue\">" + text + "</font>";
                    else if (result)
                        text = "<a href = \"" + format + "\" target = \"_blank\">" + text + "</a>";
                    else if (System.IO.File.Exists(path + format))
                    {
                        string fileName = System.IO.Path.GetFileName(path + format);
                        text = "<a href = \" \\s\\Download\\" + fileName + "\">" + text + "</a>";
                    }
                }

                value = value.Replace(unformattedText, text);

            }
            return value;
        }
        return value;
    }
公共静态字符串格式(此字符串值)
{
System.Uri uriResult=null;
布尔结果=假;
字符串路径=ConfigurationManager.AppSettings[“路径”];
如果(value.Length>0)
{
if(value.Contains(“{”)&&value.Contains(“|”)&&value.Contains(“}”))
{
int totalLength=值。长度;
字符串unformatedText=value.Substring(value.IndexOf(“{”),(value.IndexOf(“}”)-value.IndexOf(“{”)+2);
string flowersRemoved=unformattedText.Substring(0,unformattedText.Length-2);
flowersRemoved=flowersRemoved.Substring(2,flowersRemoved.Length-2);
string[]textFormats=flowersRemoved.Split(“|”);
字符串文本=文本格式[0];
字符串[]格式=文本格式[1]。拆分(',');
foreach(格式中的字符串格式)
{
result=Uri.TryCreate(format.ToLower(),UriKind.Absolute,out-uriResult)和&uriResult.Scheme==Uri.urischemehtp;
if(format.ToLower()=“粗体”)
text=”“+text+”;
else if(format.ToLower()=“红色”)
text=”“+text+”;
else if(format.ToLower()=“蓝色”)
text=”“+text+”;
否则,如果(结果)
text=“”;
else if(System.IO.File.Exists(路径+格式))
{
字符串文件名=System.IO.Path.GetFileName(路径+格式);
text=“”;
}
}
value=value.Replace(未格式化文本,文本);
}
返回值;
}
返回值;
}
图案有时可能是
{printing |蓝色,粗体,http://www.google.com}}

尝试拆分

使用
Split()

string str = "{{printing|blue,bold,http://www.google.com}}";

// get your settings
int pFrom = str.IndexOf("{{") + "{{".Length;
int pTo = str.LastIndexOf("}}");
string settings = str.Substring(pFrom, pTo - pFrom);

// split 
string[] parts = settings.Split('|');
string key = parts[0];
string[] values = parts[1].Split(',');

// for demo purposes only
Console.WriteLine(key);
foreach(var v in values)
{
    Console.WriteLine("-" + v);
}
输出

printing
-blue
-bold
-http://www.google.com
<a href ='http://www.google.com' target = '_blank'>
    <font color ='blue'>
        <b>printing</b>
    </font>
</a>
如果将其固定在末尾,则可以获得所需的HTML:

// create html
var html = string.Format(@"
<a href='{3}' target ='_blank'>
    <font color='{1}'>
        <b>{0}</b>
    </font>
</a>", key, values[0], values[1], values[2]);

Console.WriteLine(html);
//创建html
var html=string.Format(@)
,键,值[0],值[1],值[2]);
Console.WriteLine(html);
输出

printing
-blue
-bold
-http://www.google.com
<a href ='http://www.google.com' target = '_blank'>
    <font color ='blue'>
        <b>printing</b>
    </font>
</a>


.

您可以使用带有replace函数的next regexp

string str = "{{Lorem Ipsum|bold}}";
string path = ConfigurationManager.AppSettings["path"];
var formattedString = Regex.Replace(str, @"{{(?<symbol>[^|]+?)\|(?<formats>.+?)}}", m =>
{
    var formatedPattern = m.Groups["formats"].Value.Split(',').Aggregate("{0}", (acc, f) =>
    {
        switch (f.ToLower())
        {
            case "bold": return "<b>" + acc + "</b>";
            case "red": return "<font color = \"red\">" + acc + "</font>";
            case "blue": return "<font color = \"blue\">" + acc + "</font>";
        };

        Uri uriResult;
        if (Uri.TryCreate(f.ToLower(), UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp)
        {
            return "<a href = \"" + f + "\" target = \"_blank\">" + acc + "</a>";
        }
        else if (System.IO.File.Exists(path + f))
        {
            string fileName = System.IO.Path.GetFileName(path + f);
            return "<a href = \" \\s\\Download\\" + fileName + "\">" + acc + "</a>";
        }
        return acc;
    });
    return string.Format(formatedPattern, m.Groups["symbol"].Value);
});
string str=“{{Lorem Ipsum | bold}}”;
字符串路径=ConfigurationManager.AppSettings[“路径”];
var formattedString=Regex.Replace(str,@“{{(?[^ |]+?)\\\\\(?。+?)}”),m=>
{
var formattedpattern=m.Groups[“formats”].Value.Split(',').Aggregate(“{0}”,(acc,f)=>
{
开关(f.ToLower())
{
粗体:返回“+acc+”;
案例“红色”:返回“+acc+”;
案例“蓝色”:返回“+acc+”;
};
Uri结果;
if(Uri.TryCreate(f.ToLower(),UriKind.Absolute,out-uriResult)和&uriResult.Scheme==Uri.UriSchemeHttp)
{
返回“”;
}
else if(System.IO.File.Exists(path+f))
{
字符串fileName=System.IO.Path.GetFileName(Path+f);
返回“”;
}
返回acc;
});
返回string.Format(formattern,m.Groups[“symbol”].Value);
});

您能显示到目前为止您编写的代码吗?如果图案为
{{printing |蓝色,粗体,http://www.google.com}}
,那么您希望在数组中添加什么?例如,生成的数组是否如下所示:
var printing=string[]{“blue”、“bold”和“http://www.google.com" }
?如果您只需要放置
打印
蓝色,粗体,http://www.google.com
对于数组,我怀疑您需要一个正则表达式,除非您在内容中转义了管道符号。会有吗?对于“{Lorem Ipsum | bold}}”、“Lorem Ipsum”或“{{Lorem Ipsum | bold}”有什么预期的输出?事实上,这和OP节目一样,更糟糕的是花括号没有被删除。如果我有一个字符串{printing | blue,bold,}},我会将它格式化为
@stribizev花括号现在被删除了。:-。谢谢。@Ram上面的工作是为了你的格式化目的吗?如果没有,障碍是什么?{Lorem Ipsum | bold}}只是{{printing | blue}}和排版行业。如果我需要格式化“Lorem Ipsum”和“printing”,我不能使用indexof。