繁体   English   中英

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

[英]capture string from a string c#

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

例如: string str = "{{Lorem Ipsum|bold}}"只是印刷和排版行业的伪文本。

我已经使用IndexOf从字符串中提取了Lorem Ipsum,并以粗体显示。 但是如果我有两个单词要在同一字符串中设置格式,则会面临问题。

例如: string str ="{{Lorem Ipsum|bold}}"只是"{{printing|blue}}"和排版行业的伪文本。

有人可以帮我解决任何正则表达式模式问题,以提取{{Lorem Ipsum|bold}}{{printing|blue}}作为c#中的数组。

注意:该模式有时可能为{{printing|blue,bold,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;
    }

该模式有时可能是{{printing|blue,bold,http://www.google.com}}

尝试Split

以下小提琴使用Split()而不是regex,因为regex往往难以阅读。 结果key字符串包含要格式化的单词, values字符串数组包含相关设置。

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

如果您最终提出了此建议,则可以使用所需的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);

产量

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

观看它在这里运行

您可以使用带有替换功能的下一个正则表达式

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM