如何解决避免不必要的字符串替换
我有一个字符串模式,用于组装自动文件名。该模式可能包含一些属性,例如:
[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",};
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]+\]"
),然后再通过首先检查匹配字符串的索引来开始替换。但是,如果将来其他人必须遵循这种逻辑,那么这太冗长和令人讨厌,无法阅读。有什么想法和建议吗?
预先感谢!
解决方法
您可以使用Regex.Replace
一次更新所有匹配项。
这样,您就不会覆盖已经进行的任何替换:
var namingPattern = "[UserName] @ [ItemName] (id: [ItemId])";
var regexPattern = string.Join("|",propertyDict.Keys.Select(Regex.Escape));
// \[UserName]|\[ItemName]|\[ItemId]
var fileName = Regex.Replace(namingPattern,regexPattern,match => propertyDict[match.Value]);
为避免必须使用Regex.Escape
键,可以改用大括号:
var propertyDict = new Dictionary<string,string>()
{
["{UserName}"] = "John Smit",["{ItemName}"] = "Berry 47",["{ItemId}"] = "123456",};
var namingPattern = "{UserName} @ {ItemName} (id: {ItemId})";
var regexPattern = string.Join("|",propertyDict.Keys);
// {UserName}|{ItemName}|{ItemId}
var fileName = Regex.Replace(namingPattern,match => propertyDict[match.Value]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。