字符串替换与字典异常处理

时间:2014-08-29 15:09:39

标签: regex vb.net dictionary replace token

我已经在这里实现了答案来替换字符串: 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

3 个答案:

答案 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初始化和编译,以适应我的特定用例:

  • 此代码所使用的屏幕可能无法使用
  • 但一旦它,它将被大量使用
  • 所以它应该尽可能高效地进行后续通话。