是否有可能在单个Regex中用不同的字符串模式替换不同的数字?替换语句
本文关键字:替换 有可能 模式 数字 语句 字符串 是否 单个 Regex | 更新日期: 2023-09-27 18:13:32
例如:我有作为输入字符串"635783455831176452",并希望将每6替换为K,每7替换为L,每1替换为u。这可以在一个单一的正则表达式内完成。我知道我可以使用嵌套的替换语句,比如
Regex.Replace(
Regex.Replace(
Regex.Replace(
"635783455831176452", "6+", "K"),
"7+", "L"),
"1+", "U");
但是,关键是使用单个regex.replace。这是可能的吗?如果是的话,语法是什么?非常感谢!
根据您的描述,我会说正则表达式是错误的工具。一些自定义的扩展方法可以做到,例如:
static class StringExtensions
{
public static string tr(this string st,
string orig, string replacement)
{
var sb = new StringBuilder(st.Length);
foreach (char c in st)
{
bool replaced = false;
for (int i = 0; i < orig.Length; ++i)
{
if (replacement.Length > i && c == orig[i])
{
sb.Append(replacement[i]);
replaced = true;
break;
}
}
if (!replaced) sb.Append(c);
}
return sb.ToString();
}
}
用法:
static class Program
{
static int Main()
{
Console.WriteLine("1234567890".tr("167", "UKL"));
return 0;
}
}
按要求评论作为答案。
这是Felix Palmen已经给出的相同答案,但它使用了Linq。
public static string tr(this string st, string orig, string replacement)
{
var orgToRep = orig
.Zip(replacement, (x, y) => new { x, y })
.ToDictionary(x => x.x, x => x.y);
return new string(
st
.Select(
x =>
{
char rep;
return orgToRep.TryGetValue(x, out rep) ? rep : x;
})
.ToArray());
}
如果你有一个IDictionary<TKey, TValue>
的扩展方法叫做GetValueOrDefault
,就像Nullable一样你可以把它写得更短:
public static string tr(this string st, string orig, string replacement)
{
var orgToRep = orig
.Zip(replacement, (x, y) => new { x, y })
.ToDictionary(x => x.x, x => x.y);
return new string(st.Select(x => orgToRep.GetValueOrDefault(x, x)).ToArray());
}