首页 > 解决方案 > 使用映射值查找和替换子字符串

问题描述

一些设置存储在字符串中。一个例子可能是

string rawWatermarkFormat = "{@Charge}; {Current Date} {Current Time}; Scan Operator: {Scan Operator's User ID}; Page: x/y";

由{...}包裹的每个子字符串代表一个字典的键。该字典包含需要替换键的值。最后的字符串是

string parsedWatermarkFormat = "phosphoric acid; 24.04.2019 14:20; Scan Operator: 123; Page: x/y";

(是的,当前日期和当前时间也存储在该集合中)

我想提取这些键,从集合中获取正确的值并用值替换键。我从这个开始

    public Parse()
    {
        string watermarkFormat = "{@Charge}; {Current Date} {Current Time}; Scan Operator: {Scan Operator's User ID}; Page: x/y"; // batch.get_CustomStorageString(Resources.WATERMARK_FORMAT_KEY);

        int currentFieldStart = 0;

        for (int i = 0; i < watermarkFormat.Length; i++)
        {
            char currentCharacter = watermarkFormat[i];

            if (currentCharacter == '{')
            {
                currentFieldStart = i;
            }
            else if (currentCharacter == '}')
            {
                int length = i - currentFieldStart;
                string currentField = watermarkFormat.Substring(currentFieldStart + 1, length - 1);

                string fieldValue = "---"; // access the collection for the correct field value

                watermarkFormat = watermarkFormat
                    .Remove(currentFieldStart, length)
                    .Insert(currentFieldStart, fieldValue);
            }
        }
    }

问题是,如果我使用范围替换子字符串,则字符串会中断。如果键的长度为 x 且值的长度为 y,则替换方法不适用于下一个字段。

所以这个watermarkFormat示例字符串将导致

---} {Current Time}; Scan Operator: ---}; Page: x/y

如何正确替换字段?


编辑:rawWatermarkFormat只是一个示例字符串!我不知道它的长度、标记等。所以字符串也可能是这个

string rawWatermarkFormat = "{Current Date} {Current Date} {Current Date} {Current Date} {Current Date}"

或这个

string rawWatermarkFormat = "{blue car}"

我必须提取这些字符串并从字典中获取正确的值。我自己不知道这些令牌。

标签: c#

解决方案


使用正则表达式作为替代。

string pattern = @"\{[a-zA-Z\-\s\@\']+\}";
string input = "{@Charge}; {Current Date} {Current Time}; Scan Operator: {Scan Operator's User ID}; Page: x/y";
var matches = System.Text.RegularExpressions.Regex.Matches(input, pattern);
foreach (var match in matches)
{
    Console.WriteLine(match);
    // TODO replace
    // var key = match.ToString();
    // input = input.Replace(key, someMethodToGetValue(key.Replace("{", "").Replace("}", "")));
}

控制台输出:

{@Charge}
{Current Date}
{Current Time}
{Scan Operator's User ID}

推荐阅读