C# 用变量替换文本文件中存储的字符串中的占位符

C# 用变量替换文本文件中存储的字符串中的占位符,c#,.net,windows-10-universal,C#,.net,Windows 10 Universal,我在C#和.NetCore中有一个Windows UWP应用程序。我有一种特殊类型的打印机,需要发送特定字符串来打印标签。因此,我将标签定义/格式存储在单独的文本文件中。当应用程序加载并尝试打印时,我读取文本文件并加载字符串。然而,当我读入这个字符串时,其中有一些变量需要用实际数据替换。目前,我正在使用占位符并用大括号突出显示它们。然而,如果这更容易的话,我可以使用帕伦斯或其他东西。另外,我知道使用string.Format,您通常会用数字来枚举要在大括号中替换的变量,但我选择使用单词来提高定义

我在C#和.NetCore中有一个Windows UWP应用程序。我有一种特殊类型的打印机,需要发送特定字符串来打印标签。因此,我将标签定义/格式存储在单独的文本文件中。当应用程序加载并尝试打印时,我读取文本文件并加载字符串。然而,当我读入这个字符串时,其中有一些变量需要用实际数据替换。目前,我正在使用占位符并用大括号突出显示它们。然而,如果这更容易的话,我可以使用帕伦斯或其他东西。另外,我知道使用string.Format,您通常会用数字来枚举要在大括号中替换的变量,但我选择使用单词来提高定义文本文件的可读性

因此,当我从文本文件中获取原始字符串并对其进行解析(并将其存储在我的类属性中)后,这里就是原始字符串

^XA ^LL300 ^FO125575 ^A0R,30,30 ^FDRecipient:{Recipient} ^财政司司长 ^FO175575 ^A0R,30,30 ^FDM/S:{EmpMail} ^财政司司长 ^FO275575 ^A0R,30,30 ^FDTelephone:{emphone} ^财政司司长 ^FO350575 ^A0R,30,30 ^FDProcessed:{DateTime.Now} ^财政司司长 ^FO290210 ^B7R,8,5,7,21,N ^FD{EmpNum} ^财政司司长 ^XZ

在这里,您可以看到五个左右的变量占位符,在花括号中,我想用真实数据替换它们

问题是,如何获取现在存储在类中的属性中的字符串,并用数据替换所有占位符

这里是我到目前为止掌握的一些情况。我没有得到任何例外,但它实际上并没有像它应该的那样替换数据。例如,下面的代码示例应该将{DateTime.Now}替换为实际的DateTime.Now},但是现在没有,我仍然可以看到我的占位符

  • 下面是此代码所需的两个字段

    public const string LabelDateTime=“{DateTime.Now}”; 私有字符串位置标签=string.Empty

  • locationLabel是在类的构造过程中,当我用上面显示的字符串读入文本文件时填充的

  • 下面是我将实际检测和替换所有占位符的方法。现在,作为测试,我只做了DateTime.now

    private string replacePrintStringVariablesWithValues()
    {
        var finalPrintString = this.labelString;
        //Below we will check for and replace all of the possible variables to the print string.
        //TODO: we will need to refine/add more to this as labels are created. I tried to capture most now.
        if (labelString.Contains(LabelDateTime))
        {
            finalPrintString = ReplaceWholeWord(finalPrintString, LabelDateTime, DateTime.Now.ToString());
        }
    
        return finalPrintString;
    }
    
  • 这里有一个使用正则表达式查找和替换的方法

    /// <summary>
    /// Uses regex '\b' as suggested in //http://stackoverflow.com/questions/6143642/way-to-have-string-replace-only-hit-whole-words
    /// </summary>
    /// <param name="original"></param>
    /// <param name="wordToFind"></param>
    /// <param name="replacement"></param>
    /// <param name="regexOptions"></param>
    /// <returns></returns>
    private static string ReplaceWholeWord(string completeString, string variableToReplace,
        string replacement, RegexOptions regexOptions = RegexOptions.IgnoreCase)
    {
        var pattern = string.Format(@"\b{0}\b", variableToReplace);
        var ret = Regex.Replace(completeString, pattern, replacement, regexOptions);
        return ret;
    }
    
    //
    ///按照中的建议使用正则表达式“\b”//http://stackoverflow.com/questions/6143642/way-to-have-string-replace-only-hit-whole-words
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    私有静态字符串替换wholeword(字符串completeString,字符串变量toreplace,
    字符串替换,RegexOptions RegexOptions=RegexOptions.IgnoreCase)
    {
    var pattern=string.Format(@“\b{0}\b”,variableToReplace);
    var ret=Regex.Replace(completeString、pattern、replacement、regexOptions);
    返回ret;
    }
    
  • 但是再一次,总结一下,如果我在返回之前查看字符串ret,我的{DateTime.Now}仍然是这样说的,并且没有被实际的DateTime.Now替换。此外,我检查了模式和替换参数,它们是正确的

    图案显示为

    \b{DateTime.Now}\b

    替换显示为

    2017年4月4日下午5:40


    元字符
    \b
    匹配字类字符和非字类字符之间的零宽度边界

    {
    }
    不是词类字符。所以你的模式不起作用


    删除
    \b
    或将其替换为
    \s
    元字符
    \b
    匹配字类字符和非字类字符之间的零宽度边界

    {
    }
    不是词类字符。所以你的模式不起作用


    删除
    \b
    或将其替换为
    \s

    我没有尝试执行这些操作,但我只是从两端删除了\b,并且成功了。非常感谢。我没有尝试执行\s,但我只是从两端删除了\b,并且成功了。非常感谢。