我已经在这里实现了答案来替换字符串: https://stackoverflow.com/a/1231815/1224021
我现在的问题是当此方法找到一个值不在字典中的标记时。我得到了例外情况“字典中没有给定的密钥。”并返回正常的字符串。我希望发生的事情显然是所有好的代币都被取代了,但是那个令人讨厌的代币仍然存在。猜测我需要做一个循环而不是一行正则表达式替换?使用vb.net。这就是我目前正在做的事情:
Shared ReadOnly re As New Regex("\$(\w+)\$", RegexOptions.Compiled)
Public Shared Function GetTokenContent(ByVal val As String) As String
Dim retval As String = val
Try
If Not String.IsNullOrEmpty(val) AndAlso val.Contains("$") Then
Dim args = GetRatesDictionary()
retval = re.Replace(val, Function(match) args(match.Groups(1).Value))
End If
Catch ex As Exception
' not sure how to handle?
End Try
Return retval
End Function
答案 0 :(得分:1)
该行可能会抛出异常
retval = re.Replace(val, Function(match) args(match.Groups(1).Value))
因为这是你键入字典的唯一地方。在访问之前使用Dictionary.ContainsKey method。
retval = re.Replace(val,
Function(match)
return If(args.ContainsKey(match.Groups(1).Value), args(match.Groups(1).Value), val)
End Function)
答案 1 :(得分:1)
这就是我的工作与正则表达式的对比,这也是Allen Wang原始帖子的建议:https://stackoverflow.com/a/7957728/1224021
Public Shared Function GetTokenContent(ByVal val As String) As String
Dim retval As String = val
Try
If Not String.IsNullOrEmpty(val) AndAlso val.Contains("$") Then
Dim args = GetRatesDictionary("$")
retval = args.Aggregate(val, Function(current, value) current.Replace(value.Key, value.Value))
End If
Catch ex As Exception
End Try
Return retval
End Function
答案 2 :(得分:0)
我知道自从这个问题得到解答已经有一段时间了,但对于任何想要仍然使用正则表达式/字典匹配方法的人来说,以下工作(基于OP问题中的样本):
retVal = re.Replace(formatString,
match => args.ContainsKey(match.Groups[1].Captures[0].Value)
? args[match.Groups[1].Captures[0].Value]
: string.Empty);
...或我的完整样本作为字符串扩展方法是:
public static class StringExtensions
{
// Will replace parameters enclosed in double curly braces
private static readonly Lazy<Regex> ParameterReplaceRegex = new Lazy<Regex>(() => new Regex(@"\{\{(?<key>\w+)\}\}", RegexOptions.Compiled));
public static string InsertParametersIntoFormatString(this string formatString, string parametersJsonArray)
{
if (parametersJsonArray != null)
{
var deserialisedParamsDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(parametersJsonArray);
formatString = ParameterReplaceRegex.Value.Replace(formatString,
match => deserialisedParamsDictionary.ContainsKey(match.Groups[1].Captures[0].Value)
? deserialisedParamsDictionary[match.Groups[1].Captures[0].Value]
: string.Empty);
}
return formatString;
}
}
这里有几点需要注意:
1)我的参数作为JSON数组传入,例如:{"ProjectCode":"12345","AnotherParam":"Hi there!"}
2)用于替换的实际模板/格式字符串具有用双花括号括起来的参数:"This is the Project Code: {{ProjectCode}}, this is another param {{AnotherParam}}"
3)正则表达式是Lazy初始化和编译,以适应我的特定用例: