我有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
可能是一种方式,但我不知道如何实现它。
答案 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");
,并在每个正则表达式的末尾添加^
,例如$
,以确保正则表达式将不匹配部分子串。