我在C#和.NetCore中有一个Windows UWP应用程序。我有一种特殊类型的打印机,要求我发送特定的字符串来打印标签。因此,我将标签定义/格式存储在单独的文本文件中。当应用程序加载并尝试打印时,我然后读取文本文件并加载字符串。但是,当我读取它时,在该字符串中有一些变量,我需要用实际数据替换。目前,我正在使用占位符并用花括号突出显示它们。但是,如果这更容易,我可以使用parens或其他东西。另外,我知道使用string.Format,你通常会在花括号中用数字枚举你的变量,但是我选择使用单词来使定义文本文件更具可读性。
所以,这是原始字符串,一旦我从文本文件中获取它并解析它(并将其存储在我的类属性中)。
^ XA ^ LL300 ^ FO125,575 ^ A0R,30,30 ^ FDRecipient:{收件人} ^ FS ^ FO175,575 ^ A0R,30,30 ^ FDM / S:{EmpMail} ^ FS ^ FO275,575 ^ A0R,30,30 ^ FD电话:{EmpPhone} ^ FS ^ FO350,575 ^ A0R,30,30 ^ FDProcessed:{DateTime.Now} ^ FS ^ FO290,210 ^ B7R,8,5,7,21,N ^ FD {EmpNum} ^ FS ^ XZ
在这里,你可以在大括号中看到我想用真实数据替换的五个左右的可变占位符。
问题是,如何获取现在存储在我的类中的属性中的字符串,并用数据替换所有占位符。
为了给出一些背景,这是我到目前为止所拥有的。我没有得到任何例外但它实际上并没有像它应该那样替换数据。例如,下面的代码示例应该用实际的DateTime.Now替换{DateTime.Now},但它没有,我仍然看到我的占位符。
以下是此代码所需的两个字段
public const string LabelDateTime =“{DateTime.Now}”; private string locationLabel = 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;
}
这里有一种使用Regex查找和替换
的方法/// <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;
}
但是,总而言之,如果我在它返回之前查看字符串ret,我的{DateTime.Now}仍然只是说并且没有被实际的DateTime.Now替换。此外,我确实检查了模式和替换参数,它们是正确的。
模式显示为
\ B {DateTime.Now} \ B'/ P>
和替换显示为
4/4/2017 5:40 PM
答案 0 :(得分:2)
元字符{
匹配单词类字符和非单词类字符之间的零宽度边界。
}
和\b
不是单词类字符。所以你的模式不起作用。
删除\s
或将其替换为INSERT INTO table (column[]) VALUES (values[])
。