基于字典的字符串操作

时间:2016-02-18 10:03:05

标签: c# regex dictionary

我有Dictionary<string, string>用于将string与新的匹配。

Dictionary<string, string> dictionary = new Dictionary<string, string>()
{
    { "foo", "bar" }
};

我用来匹配string

的方法
public static string GetValueOrKeyAsDefault(this Dictionary<string, string> dictionary, string key)
{
    string value;
    return dictionary.TryGetValue(key, out value) ? value : key;
}

像这样使用:

string s1 = dictionary.GetValueOrKeyAsDefault("foo"); /* s1 equals "bar" */
string s2 = dictionary.GetValueOrKeyAsDefault("test"); /* s2 equals "test" */

我现在想要部分匹配string并将此字符串的一部分保留在匹配的字符串中。

/* {0} is arbitrary, could be anything else */
Dictionary<string, string> dictionary = new Dictionary<string, string>()
{
    { "SPROC:{0}", "{0}" },
    { "onClick='{0}(this)'", "{0}" }
};

string s1 = dictionary.SomeMethod("SPROC:my_sproc"); /* s1 equals "my_sproc" */
string s2 = dictionary.SomeMethod("onClick='HandleOnClick(this)'"); /* s1 equals "HandleOnClick" */

我觉得regex可能是一种方式,但我不知道如何实现它。

1 个答案:

答案 0 :(得分:2)

请注意,在这里使用{ "List": [ { "Key": "'{i18n>value1}'" }, { "Key": "'{i18n>value2}'" }, ... ] } 是“道德上的”错误...我会使用Dictionary<,>。出于两个原因在道德上是错误的:各种键值的排序(因此优先级)不是“固定的”并且可能是非常随机的并且您无法利用List<Tuple<Regex, string>>的强度: O(1)完全匹配(Dictionary<,>)。

还是:

TryGetValue

请注意,您必须使用public static string SomeMethod(Dictionary<string, string> dictionary, string str) { foreach (var kv in dictionary) { var rx = new Regex(kv.Key); if (rx.IsMatch(str)) { string replaced = rx.Replace(str, kv.Value); return replaced; } } return str; } Dictionary<string, string> dictionary = new Dictionary<string, string>() { { @"SPROC:(.*)", "$1" }, { @"onClick='(.*)\(this\)'", "$1" } }; string replaced = SomeMethod(dictionary, "SPROC:my_sproc"); “语言”(请参阅​​Regex(.*)

没有无用的$1

Dictionary<,>

作为旁注,我会在每个正则表达式的开头添加public static string SomeMethod(IEnumerable<Tuple<Regex, string>> tuples, string str) { foreach (var rr in tuples) { if (rr.Item1.IsMatch(str)) { string replaced = rr.Item1.Replace(str, rr.Item2); return replaced; } } return str; } var dictionary = new[] { Tuple.Create(new Regex("SPROC:(.*)"), "$1"), Tuple.Create(new Regex(@"onClick='(.*)\(this\)'"), "$1"), }; string replaced = SomeMethod(dictionary, "SPROC:my_sproc"); ,并在每个正则表达式的末尾添加^,例如$,以确保正则表达式将不匹配部分子串。