【发布时间】:2020-08-28 12:44:11
【问题描述】:
我有一个用于组装自动文件名的字符串模式。该模式可能包含几个属性,例如:
[UserName]
[ItemName]
[ItemId]
等等... 当要创建名称时,我获取属性的值并在模式中替换它们以获得所需的名称。例如:
var propertyDict = new Dictionary<string, string>()
{
["[UserName]"] = "John Smit",
["[ItemName]"] = "Berry 47",
["[ItemId]"] = "123456",
};
var namingPattern = "[UserName] @ [ItemName] (id: [ItemId])";
// Expected result "John Smit @ Berry 47 (id: 123456)"
这很容易解决,只需一个 foreach 循环,我将字典键的任何匹配项替换为其各自的值:
foreach (var kvp in propertyDict)
{
namingPattern = namingPattern.Replace(kvp.Key, kvp.Value);
}
令我困扰的是用户选择了一个可能破坏逻辑的意外名称的情况。考虑以下情况:
var propertyDict = new Dictionary<string, string>()
{
["[UserName]"] = "[ItemName]", // Username matches with one of the placeholders
["[ItemName]"] = "Berry 47",
["[ItemId]"] = "123456",
};
var namingPattern = "[UserName] @ [ItemName] (id: [ItemId])";
// Expected result "[ItemName] @ Berry 47 (id: 123456)"
// Actual result "Berry 47 @ Berry 47 (id: 123456)"
我找到了一种使用 RegEx 解决此问题的方法。我的想法是在进行任何字符串替换之前匹配所有可能的占位符("\[[a-zA-Z]+\]"),然后通过首先检查匹配字符串的索引来开始替换。但是,如果将来其他人必须通过此逻辑,则阅读起来太冗长且烦人。有什么想法和建议吗?
提前致谢!
【问题讨论】:
-
@WiktorStribiżew 它看起来正是我需要的东西!非常感谢!我马上试试。
标签: c# regex placeholder