是否有可能在单个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。这是可能的吗?如果是的话,语法是什么?非常感谢!

是否有可能在单个Regex中用不同的字符串模式替换不同的数字?替换语句

根据您的描述,我会说正则表达式是错误的工具。一些自定义的扩展方法可以做到,例如:

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());
}