c# - 使用映射值查找和替换子字符串
问题描述
一些设置存储在字符串中。一个例子可能是
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}"
我必须提取这些字符串并从字典中获取正确的值。我自己不知道这些令牌。
解决方案
使用正则表达式作为替代。
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}
推荐阅读
- tizen - 无法在 Tizen Studio 中下载新图像和创建模拟器
- c# - (&(objectClass=user)(|(displayName)) 搜索过滤器无效
- r - 如何使用 R 中的 WOE 和 IV 替换分类或连续变量中的 NA?
- c++ - Spirit 仅在似乎从 Lexer 获得第一个符号后无法解析
- java - 如何从 Android 更新 DynamoDB 中的项目?
- hadoop - 如何在启用 kerberos 的 HDFS 中创建非超级用户
- c++ - clang-7:错误:链接器命令失败,退出代码为 1
- sql - 如何在其他列的基础上填充一列?
- gradle - 无法在 Kotlin 上导入 gradle 依赖项的类
- opencv - OpenCV-如何从相机旋转捕获的视频